Boost logo

Threads-Devel :

From: Petru Marginean (petru.marginean_at_[hidden])
Date: 2007-06-16 09:44:49


I would like to re-implement this (callback) function that currently uses

   pthread_mutex_t mutex;
   int i = pthread_mutex_init(&mutex, 0);

   void MutexCB(int lock)
       if (lock)

using the boost library (so the code will be portable).

The function is necessary in order to use some third party API.
It has to lock the mutex if 'lock' == true, unlock it otherwise.
It has to be thread safe as well.

I had difficulties since the scoped_lock is NOT thread safe, and the access
to the mutex's do_lock()/do_unlock() methods is private.

Here is a solution that uses:
- recursive mutex,
- a static lock that gives the access to the lock/unlock mechanism
- another lock (on the stack) that makes the static lock thread safe

    boost::recursive_mutex m;

    void MutexCB(int lock)
        boost::recursive_mutex::scoped_lock l(m); // it makes the 's'lock
thread safe
        static boost::recursive_mutex::scoped_lock s(m, false /*lock only if
        if (lock)
       if (!lock)

As you can see it is more complicated that the pthread solution and less
efficient, since it does a extra lock/unlock every time.
Is it possible to write a solution at least as simple as the original one?

Petru Marginean

Threads-Devel list run by bdawes at, david.abrahams at, gregod at, cpdaniel at, john at