如何正确使用boost :: timed_mutex和scoped_lock

时间:2014-06-07 10:30:38

标签: c++ boost locking boost-thread boost-mutex

我正在尝试将timed_mutex与scoped_lock一起使用。我之前通过一些例子成功地使用了scoped_lock,但现在我似乎并没有找到解决方法,我无法正确理解boost文档。

所需的行为如下:尝试获取scoped_lock的x时间,如果成功则返回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是否会返回一个布尔值时,我找不到任何东西或找到真正不同的方法来做到这一点。

因此,我想问哪个是正确的方法,它是如何工作的,也许是关于如何正确“阅读”boost文档的一些指示。

更新:

所以

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?

1 个答案:

答案 0 :(得分: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;

    // ...
};

现在查看boost::unique_lock的{​​{3}},它表明有两种方法可以确定您是否拥有该锁:

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有一个构造函数,它将相对时间作为chrono :: duration,它可能比使用绝对时间更清晰。

编辑: 鉴于此代码:

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()时。是的,只有在您成功获得互斥锁后,才会执行独占代码。我不确定你的意思&#34;返回false&#34; - 此代码不返回任何内容。如果owns_lock()返回false,那么您无法获取互斥锁并且无法运行独占代码,并且您可以将此信息传达给您的呼叫者。