Boost logo

Boost Users :

From: William E. Kempf (wekempf_at_[hidden])
Date: 2002-12-04 12:03:43


James Zappia said:
>> I'm a newbie to C++ and Boost and I'm trying to port a threaded C
>> program I have to Boost.Threads. I'm trying to use scoped_try_lock to
>> test a lock on mutex and it's not working. I'm obviously doing
>> something wrong but I can't figure it out. Below is the source code.
>> Any help would be greatly appreciated.
>
>>>How is it not working? What do you expect to happen?
>
> What I want to happen is that the main thread keeps trying the lock
> until it's freed.
>
>> SOURCE:
>>
>> #include <iostream>
>> #include <boost/thread/thread.hpp>
>> #include <boost/thread/exceptions.hpp>
>>
>> using namespace std;
>>
>> boost::try_mutex mutex;
>>
>> void thread_test( void )
>> {
>> cout << "thread: locking mutex\n";
>>
>> {
>> boost::try_mutex::scoped_try_lock lock(mutex);
>> cout << "thread: sleeping for 10 seconds\n";
>> sleep(10);
>> }
>>
>> cout << "thread: unlocked mutex - goodbye!\n";
>>
>> return;
>> }
>>
>> int main( void )
>> {
>> cout << "main: creating thread\n";
>> boost::thread thread(thread_test);
>>
>> cout << "main: sleeping for 2 seconds\n";
>> sleep(2);
>>
>> cout << "main: trying to lock mutex\n";
>> boost::try_mutex::scoped_try_lock lock(mutex,true);
>
>>>This will force a lock (which means we'll block until the thread
>>> releases the lock).

Change this to:
   boost::try_mutex::scoped_try_lock lock(mutex, false);
This will create your lock object, but not actually lock the mutex. Now
the following line will do what you want.

>> while ( !lock.try_lock() )

Alternatively, you could change the loop (and the constructor again):
   boost::try_mutex::scoped_try_lock lock(mutex); // does a try_lock
   while (!lock) {
      cout << "trying...";
      lock.try_lock();
   }

>>>Since the above insured the mutex is already locked, this would be a
>>> recursive lock which should result in a thread_lock_error exception
>>> being thrown. Is this not what's happening for you?
>
> That is what's happening. As stated above, what I would like to happen
> is the main thread continuously try the lock until it's freed. What am
> I doing wrong?

I hope this makes sense and you'll understand what you're doing wrong.

William E. Kempf


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