Lock lock with try_lock

I am trying to solve the blocking problem with Boost 1.46.1 - I tried several things, but I am not happy - and therefore would like to hear the inputs from a clean cut.

Topic A:

  • Always have to wait and get a lock for the important data section.
  • Updates some important data.
  • Manual unlock (or scope)

Topic B - Never block (try_lock?) - Reads data from the critical section mentioned, if the received lock

I am not sure if I need shared_lock or I can solve it differently.

EDIT, my code looks like this: Topic A:

{
 // Critical section
 boost::mutex::scoped_lock  lock( _mutex) ;
}

Theme B:

boost::mutex::scoped_lock lock(_mutex, boost::try_to_lock);
if( lock ) {

}

But I could not register the failed try_lock - so I wonder if this really works.

Regards, Paul

+3
source share
1 answer

, , , FIFO, .. , , . :

#include <boost/thread.hpp>
#include <cstdio>

boost::mutex mutex;

void threadA()
{
    for (int i = 10; i > 0; )
    {
        boost::mutex::scoped_lock lock(mutex);
        {
            fprintf(stderr, "Locked by A\n");
            usleep(100000);
            fprintf(stderr, "Unlocked by A\n");
            i--;
        }
    }
}

void threadB()
{
    for (int i = 10; i > 0; )
    {
        boost::mutex::scoped_lock lock(mutex, boost::try_to_lock);
        if (lock)
        {
            fprintf(stderr, "Locked by B\n");
            usleep(100000);
            fprintf(stderr, "Unlocked by B\n");
            i--;
        }
        else
        {
            fprintf(stderr, "Lock failed in B\n");
            usleep(100000);
        }
    }
}

int main(int argc, char **argv)
{
    boost::thread a(threadA);
    boost::thread b(threadB);
    a.join();
    b.join();
}

Locked by A
Lock failed in B
Lock failed in B
Unlocked by A
Locked by A
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Lock failed in B
Unlocked by A
Locked by A
Unlocked by A
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
+5

All Articles