0

我正在尝试将 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?

4

1 回答 1

2

如果您查看文档boost::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它表明有两种方法可以确定您是否拥有锁:

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()调用时。是的,只有在您成功获取互斥锁后,才会执行独占代码。我不确定您所说的“返回 false”是什么意思 - 此代码不返回任何内容。如果owns_lock()返回 false,那么您无法获取互斥锁并且无法运行独占代码,您可以根据需要将其传达给调用者。

于 2014-06-07T13:59:09.067 回答