Boost logo

Boost Users :

Subject: [Boost-users] [Thread]Deadlock using shared_mutex with unique_lock
From: Stanislav Stoyanov (stystoyanov_at_[hidden])
Date: 2008-09-05 12:07:56


Hi everyone,

I am trying to use shared_mutex with unique_lock but my program blocks.
I am using boost 1.35. My compiler is MSVC 8.0.50727.762 and my OS is
Windows 2000.
Here is a minimal code to reproduce the problem:

#include "boost/thread.hpp"
#include "boost/thread/shared_mutex.hpp"
#include "boost/bind.hpp"

class Executor {
public:
    void run() {
        boost::unique_lock<boost::shared_mutex> lock(theMutex);
        boost::thread::sleep(boost::get_system_time() +
boost::posix_time::millisec(30));
    }
private:
    boost::shared_mutex theMutex;
};

void main() {
    Executor ex;
    boost::thread_group group;
    for(int i=0; i<200; i++) {
        group.create_thread(boost::bind(&Executor::run, &ex));
    }
    group.join_all();
}

The program blocks during the call of group.join_all(). According to the
Boost.Thread documentation,
unique_lock<boost::shared_mutex> lock(theMutex) acquires exclusive
ownership of theMutex. Therefore,
I expect that the behaviour of boost::unique_lock<boost::shared_mutex>
lock(theMutex); is the same as if a
boost::mutex is used. Is my assumption correct or am I missing something?

Thank you for any help you can provide,
  Stanislav




Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net