繁体   English   中英

Mutex.timed_lock(duration)和boost :: timed_mutex :: scoped_lock scoped_lock(mutex,duration)之间的区别

[英]Difference between mutex.timed_lock(duration) and boost::timed_mutex::scoped_lock scoped_lock(mutex, duration)

我想知道两者之间的区别:

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使得不必要进行解锁调用。 我的问题是指:

  1. 为什么在第一种情况下我们将timed_lock称为互斥锁的成员函数,而在第二种情况下,我们根据互斥锁和持续时间构造了一个锁。
  2. 哪一个更有效?
  3. 可以使用boost :: posix_time还是建议使用其他类型,例如计时或持续时间?
  4. 与上面指定的两种方法相比,有一种更好的方法(更快)来尝试获得“ x”时间的锁定?

我会尽力回答您的问题:

  1. 如您在本文档中可以读到的,锁被用作互斥对象的锁定状态的RAII设备。 也就是说,锁不拥有它们引用的互斥锁。 他们只是拥有互斥锁。 基本上,这意味着您在初始化互斥锁时会获取它的对应锁,并在销毁锁对象时释放互斥锁。
    这就是为什么在第二个示例中您不必从互斥锁调用timed_lock的原因,在初始化时scoped_lock会为您执行此操作。
  2. 我不知道第一个示例是否更有效,但是我确定第二个示例(RAII scoped_lock)更安全,它可以确保您不会忘记解锁互斥锁,更重要的是,它可以确保其他使用和修改您的代码的人不会引起任何与互斥锁有关的问题。
  3. 据我所知,您不能从posix_time构造scoped_lock(基本上是unique_lock<timed_mutex> )。 我个人更喜欢持续时间。
  4. 我认为,使用“持续时间”绝对时间构造锁是您的最佳选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM