【问题标题】:Difference between mutex.timed_lock(duration) and boost::timed_mutex::scoped_lock scoped_lock(mutex, duration)mutex.timed_lock(duration) 和 boost::timed_mutex::scoped_lock scoped_lock(mutex, duration) 的区别
【发布时间】:2014-08-06 03:39:14
【问题描述】:

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

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”时间的锁?

【问题讨论】:

  • 在我看来,scoped_lock 用于 timed_mutex,就像 shared_ptr 用于原始指针一样:一旦超出范围,它将解锁互斥锁。虽然它可能比简单的 timed_mutex 有更多的开销(它增加了一个额外的管理层,虽然可能非常薄),但也有一些好处。就像您的专有代码中有异常一样,互斥锁将解锁。仅使用 timed_mutex 不会发生这种情况。
  • 不错的答案,但它几乎不能回答我四个问题中的一个,因为我已经说过我知道不必要的解锁,所以如果它正在处理解锁,肯定会有更多的开销。我并不是要刻薄,但这个答案并没有为我解决问题。无论如何谢谢:)

标签: c++ boost locking boost-thread boost-mutex


【解决方案1】:

我会尽力回答你的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-17
    • 2011-02-22
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2015-02-23
    相关资源
    最近更新 更多