|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2004-07-06 05:01:48
Howard Hinnant wrote:
>
> Oops, that should be:
>
> vs this:
>
> void do_sale(rw_mutex& m)
> {
> read_lock rl(m);
>
> long balance = get_balance();
> long cost = get_total_cost();
>
> if (balance > cost)
> {
> rl.unlock(m);
> write_lock wl(m);
> cost = get_total_cost();
> set_balance(get_balance() - cost);
> wl.transfer_to_read_lock(rl);
> balance = get_balance();
> }
> // ...
> }
>
> but still looks much simpler, and smaller code size to me.
The read lock is pointless in this case. The idea is that get_balance() is
slow, so we want to perform it under only a read lock, to avoid stalling
readers unnecessarily. However your code performs it again under the write
lock anyway. It's much simpler to just do the whole operation under a write
lock.
These examples are mostly what led me to believe that promotion isn't very
useful. But I may be missing an important use case.
Demotion, on the other hand, seems useful:
int deposit( int amount )
// requires: amount > 0
// returns: new balance (atomic)
{
write_lock wr( m );
v.push_back( amount );
read_lock rd( wr );
int r = 0;
accumulate( v.begin(), v.end(), r );
return r;
}
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk