我正在尝试将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?
答案 0 :(得分:2)
如果您查看documentation,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
的{{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,那么您无法获取互斥锁并且无法运行独占代码,并且您可以将此信息传达给您的呼叫者。