|
Boost : |
From: Matthew Vogt (mvogt_at_[hidden])
Date: 2004-07-06 18:20:44
Michael Glassford <glassfordm <at> hotmail.com> writes:
> Translating this to the constructor model of promotion would have to
> look something like this, I guess:
>
> void f(read_write_mutex& m)
> {
> read_write_mutex::try_read_lock r(m);
>
> //do "read stuff"
>
> read_write_mutex::try_write_lock w(r, /*maybe a parameter here to
> use try_promote() instead of promote()*/);
>
> if (!w.locked())
> {
> r.unlock();
> w.lock();
> //redo some of "read stuff"
> }
>
> //do write stuff
> }
You could encapsulate some of that in the constructor of the write lock:
void f(read_write_mutex& m)
{
read_write_mutex::read_lock r(m);
do_read_stuff();
read_write_mutex::write_lock w(r); // Upgrade, releasing and re-acquiring
// if necessary
if (!w.atomically_promoted())
{
do_read_stuff();
}
do_write_stuff();
}
It certainly looks error-prone, by requiring a test and the repetition of the
earlier code. Makes you wonder if it should have a function to execute on
non-atomic upgrade:
{
read_write_mutex::read_lock r(m);
do_read_stuff();
read_write_mutex::write_lock w(r, bind(this, &class::do_read_stuff));
do_write_stuff();
}
You could reduce further, but I'm sure it will collapse under the weight of
real code :)
Matt
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk