Boost logo

Threads-Devel :

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


Hello,

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

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

   void MutexCB(int lock)
   {
       if (lock)
           pthread_mutex_lock(&mutex);
       else
           pthread_mutex_unlock(&mutex);
   }

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
necessary*/);
        if (lock)
           s.lock();
       if (!lock)
           s.unlock();
   }

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?

Regards,
Petru Marginean



Threads-Devel list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk