2012-11-15 120 views
4

根据标题,如何try_lock在boost :: unique_lock?如何try_lock在boost :: unique_lock <boost :: mutex>

我有这样的代码:

void mySafeFunct() 
{ 
    if(myMutex.try_lock() == false) 
    { 
     return -1; 
    } 

    // mutex ownership is automatically acquired 

    // do stuff safely 

    myMutex.unlock(); 
} 

现在,我想用一个unique_lock(这也是一个范围的互斥体),而不是普通的boost ::互斥。我想要避免函数体中的所有unlock()调用。

+3

您是否在寻找[作用域锁(http://www.boost.org/doc/libs/1_52_0/doc/html/interprocess/synchronization_mechanisms的.html#interprocess.synchronization_mechanisms.mutexes.mutexes_scoped_lock)? –

+0

我想在我的互斥锁上使用unique_lock ,就像unique_lock myUniqueLock(myMutex);并调用try_lock而不是获取构造函数上的锁(如unique_lock所做的那样) –

+0

如果您阅读['unique_lock'析构函数参考](http://www.boost.org/doc),这应该不成问题/libs/1_52_0/doc/html/thread/synchronization.html#thread.synchronization.locks.unique_lock.destructor),你会看到它解锁,因此可以用作范围锁。 –

回答

6
boost::mutex myMutex; 
boost::unique_lock<boost::mutex> lock(myMutex, boost::defer_lock); 
lock.try_lock() 
+0

整洁的解决方案!谢谢保罗! –

+0

我得到:'错误:没有匹配函数调用'boost :: unique_lock :: unique_lock(boost :: shared_mutex&,const boost :: defer_lock_t&)'' –

+0

这是一个4岁的职位,也许Boost以某种方式改变了界面...... – cpl

9

您可以推迟与Defer constructor锁定,或者使用在创建时Try constructorunique_lock

boost::mutex myMutex; 
boost::unique_lock<boost::mutex> lock(myMutex, boost::try_lock); 

if (!lock.owns_lock()) 
    return -1; 

... 
+0

伟大的解决方案,以及我会牢记!谢谢! – cpl

3

以前的答案可能是过时的。我使用升压1.53,这似乎工作:

boost::unique_lock<boost::mutex> lk(myMutex, boost::try_to_lock); 
if (lk) 
    doTheJob(); 
+0

你是否说过以前的方法不推荐使用boost 1.53?这看起来与我上面的答案相同。 – jelford

+3

区别在于锁定参数名称:boost :: try_lock vs boost :: try_to_lock – vrogach

相关问题