
Hello Marsh. thank you for your reply.
Yep, that's what the 'recursive' means: the same thread is allowed to re-acquire the lock multiple times. I see what you mean
but why would you want a thread to block in the usual case? well, I start a main thread up to a certain point but don't want to continue until 2 other threads have finished executing some Init statements
Code sample: boost::recursive_mutex rec_mutex; void F1() { cout << "F1: perform init... \n"; // decrease recursion_count rec_mutex.unlock(); // ... continue here } // F1() void F2() { cout << "F2: perform some other init... \n"; // decrease recursion_count rec_mutex.unlock(); // ... continue here } // F2() int main() { // lock twice rec_mutex.lock(); rec_mutex.lock(); // start both htreads boost::thread thrd1(&F1); boost::thread thrd2(&F2); // wait for both thread to finish their Init-part boost::recursive_mutex::scoped_lock lock(rec_mutex); // ... continue here } but the main thread doesn't stop at boost::recursive_mutex::scoped_lock lock(io_mutex); How should I implement it then? not using recursive_mutex? thank you Chris On Nov 2, 9:22 pm, Marsh Ray <ma...@extendedsubset.com> wrote:
On 11/02/2010 02:33 PM, Chris wrote:
So far no problem, but if I use recursive_mutex instead...
Scenario 2: (NOT OK)
int main() { boost::recursive_mutex io_mutex; io_mutex.lock();
// thread will NOT be blocked ??? boost::recursive_mutex::scoped_lock lock(io_mutex); cout<< "Test" // this statement is executed ??? }
no blocking occurs??
Yep, that's what the 'recursive' means: the same thread is allowed to re-acquire the lock multiple times. After all, if this thread already has acquired a lock on the mutex it's basically a no-op. The resource is protected from concurrent access.
If a thread blocks on a non-recursive mutex that it's already locked, wouldn't it be a guaranteed deadlock?
Some code might have its reasons, but why would you want a thread to block in the usual case?
Just depends on what kind of mutexes you're more familiar with I guess.
How does one lock a recursive_mutex then?
If you want to observe something blocking, create another thread.
- Marsh _______________________________________________ Boost-users mailing list Boost-us...@lists.boost.orghttp://lists.boost.org/mailman/listinfo.cgi/boost-users