![](/img/trans.png)
[英]Difference between mutex.timed_lock(duration) and boost::timed_mutex::scoped_lock scoped_lock(mutex, duration)
[英]How to correctly use boost::timed_mutex and scoped_lock
我正在尝试将timed_mutex与scoped_lock一起使用。 在遵循以下示例之前,我已经成功使用了scoped_lock,但是现在我似乎找不到办法,无法正确理解boost文档。
所需的行为如下:尝试获取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));
但是,当我尝试查找(通过增强文档或示例)此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?
如果您查看文档 , 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()
。 是的,仅当您成功获取互斥锁后,排他代码才会执行。 我不确定“返回假”是什么意思-此代码不返回任何内容。 如果owns_lock()
返回false,则说明您无法获取互斥体并且无法运行独占代码,并且可以随时将其与调用方进行通信。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.