1

我想知道两者之间有什么区别:

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 的使用是可以的,还是建议使用另一种,例如chrono 或duration?
  4. 与上面指定的两种方法相比,是否有更好的方法(更快)尝试在“x”时间内获取锁?
4

1 回答 1

1

我将尝试回答您的问题:

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