Created on 2009-09-30.00:00:00 last changed 162 months ago
Proposed resolution:
Add a new paragraph after [thread.mutex.class] p1:
1 The class mutex provides a non-recursive mutex ...
[Note: After a thread A has called unlock(), releasing the mutex, it is possible for another thread B to lock the same mutex, observe that it is no longer in use, unlock and destroy it, before thread A appears to have returned from its unlock call. Implementations are required to handle such scenarios correctly, as long as thread A doesn't access the mutex after the unlock call returns. These cases typically occur when a reference-counted object contains a mutex that is used to protect the reference count. — end note]
[ 2009-11-18: Moved to Tentatively Ready after 5 positive votes on c++std-lib. ]
If an object *o contains a mutex mu and a correctly-maintained reference count c, is the following code safe?
o->mu.lock(); bool del = (--(o->c) == 0); o->mu.unlock(); if (del) { delete o; }
If the implementation of mutex::unlock() can touch the mutex's memory after the moment it becomes free, this wouldn't be safe, and "Construction and destruction of an object of a Mutex type need not be thread-safe" [thread.mutex.requirements] may imply that it's not safe. Still, it's useful to allow mutexes to guard reference counts, and if it's not allowed, users are likely to write bugs.
History | |||
---|---|---|---|
Date | User | Action | Args |
2011-08-23 20:07:26 | admin | set | status: wp -> c++11 |
2010-10-21 18:28:33 | admin | set | messages: + msg1191 |
2010-10-21 18:28:33 | admin | set | messages: + msg1190 |
2009-09-30 00:00:00 | admin | create |