我想知道这两者之间的区别是什么
boost::timed_mutex _mutex;
if(_mutex.timed_lock(boost::get_system_time() + boost::posix_time::milliseconds(10))){
exclusive code
_mutex.unlock();
}
和
boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::milliseconds(10));
if(scoped_lock.owns_lock()) {
exclusive code
}
我已经知道 scoped_lock 使解锁调用变得不必要了。我的问题是指:
- 为什么在第一种情况下我们调用 timed_lock 作为 a 的成员函数互斥体,在第二个中,我们从互斥体和一个期间。
- 哪个更有效率?
- boost::posix_time的用法还可以或者建议换一种,例如时间还是持续时间?
- 有更好(更快)的方法来尝试获取锁的时间比上面指定的两种方法“x”时间?
我会尽量回答你的问题:
- 正如您在本 Document 中所读到的那样, 锁被用作互斥体锁定状态的 RAII 设备。也就是说,锁不拥有它们引用的互斥量。他们只是拥有互斥体上的锁。基本上它的意思是当你初始化它对应的锁时你获得互斥锁并在锁对象被销毁时释放它。
这就是为什么在第二个示例中您不必从互斥体调用 timed_lock,scoped_lock 在初始化时为您完成。
- 我不知道第一个例子是否更有效率,但我确信第二个例子(RAII scoped_lock)更安全,它保证你不会忘记解锁互斥体,更重要的是,它保证其他人使用和修改您的代码不会导致任何与互斥锁相关的问题。
- 据我所知,您不能从 posix_time 构造 scoped_lock(基本上是
unique_lock<timed_mutex>
)。我个人更喜欢持续时间。
- 在我看来,使用 Duration 绝对时间构造锁是您的最佳选择。
我是一名优秀的程序员,十分优秀!