
Howard Hinnant wrote:
On Jun 29, 2004, at 12:30 PM, Michael Glassford wrote:
Also, you could end up with some interesting situations like this:
[...] Let's assume that the guarded entity is int x;
void f(read_write_mutex m) { read_write_mutex::read_lock r(m);
int y = x;
if (...) { read_write_mutex::write_lock w(r); //lock promotion
assert( x == y); // always holds, we had a read+ lock all the time
//... } //Point A }
How 'bout:
void f(read_write_mutex& m) { read_write_mutex::read_lock r(m);
int y = x;
if (...) { r.unlock();
Thread switch, write lock, write to x happens here.
read_write_mutex::write_lock w(m); //... m is write locked
assert( x == y); // may fail
w.transfer_to_read_lock(r); } //Point A ... m is read locked }