2014-06-07 110 views
0

我想在scoped_lock中同时使用timed_mutex。我之前通过以下示例成功使用了scoped_lock,但现在我似乎无法找到解决方法,我也无法正确理解boost文档。如何正确使用boost :: timed_mutex和scoped_lock

期望的行为如下:尝试获取x时间的scoped_lock,如果成功返回true,否则返回false。

目前我有:

boost::timed_mutex _mutex; 
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10)); 

然而,当我试图找到(通过Boost文档或实例)如果此scoped_lock中会返回一个布尔与否我觉得没有什么或找到真正不同的方式来做到这一点。

因此,我问哪个是正确的方法来做到这一点,它是如何正确工作,并可能指示如何正确“读取”提升文档。

UPDATE:

所以

boost::timed_mutex _mutex; 
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10)); 

if(scoped_lock.owns_lock()) { 
    // exclusive code 
} 

将创建)一个互斥体,当我尝试用scoped_lock.owns_lock(锁定将尝试在10毫秒获取锁(在这种情况下)和返回如果时间到了,并且没有获取锁定,则返回false?

+0

这个问题可以帮助你: http://stackoverflow.com/questions/14200305/usage-of-boostunique-locktimed-lock –

回答

2

如果你看一下documentationboost::timed_mutex::scoped_lock仅仅是boost::unique_lock<timed_mutex>一个别名:

class timed_mutex: 
    boost::noncopyable 
{ 
public: 
    // ... 

    typedef unique_lock<timed_mutex> scoped_timed_lock; 
    typedef unspecified-type scoped_try_lock; 
    typedef scoped_timed_lock scoped_lock; 

    // ... 
}; 

现在检查出documentationboost::unique_lock,它表明有两种方法来确定,如果你拥有了锁:

template<typename Lockable> 
class unique_lock 
{ 
public: 
    // ... 

    explicit operator bool() const noexcept; 
    bool owns_lock() const noexcept; 

    // ... 
}; 

因此,你可以做任何

if(scoped_lock) { 
    // we have the lock, yay! 
} 

if(scoped_lock.owns_lock()) { 
    // we have the lock, yay! 
} 

顺便提及,unique_lock具有一个构造函数相对时间作为计时::持续时间,其可以是或可以不是比使用绝对时间吸尘器。

编辑: 鉴于此代码:

boost::timed_mutex _mutex; 
boost::timed_mutex::scoped_lock scoped_lock(_mutex, 
      boost::get_system_time() + boost::posix_time::miliseconds(10)); // <-- attempt to acquire mutex happens here! 

if(scoped_lock.owns_lock()) { 
    // exclusive code 
} 

获取互斥锁,发生在锁构造时间的尝试,而不是在时间owns_lock()被调用。是的,只有在您成功获取互斥锁后才会执行独占代码。我不确定你的意思是“返回false” - 这段代码不会返回任何东西。如果owns_lock()返回false,那么您无法获得互斥锁并且无法运行独占代码,并且您可以随意将其传递给呼叫者。

+0

我已经更新了我的问题,以反映您的信息,并确保我已经很好理解了,请确认我是对的! –

+0

@ConradKurtz请参阅编辑。 –