mutex.timed_lock(duration)和boost :: timed_mutex :: scoped_lock scoped_lock(互斥,持续时间)之间的区别

时间:2014-06-16 10:26:36

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

我想知道它们之间有什么区别:

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称为a的成员函数 互斥和第二个我们构建一个互斥锁和一个锁 持续时间。
  2. 哪一个效率更高?
  3. 使用boost :: posix_time是可以的,或者建议使用另一种, 例如计时或持续时间?
  4. 尝试更好的方法(更快) 获得一个锁'x'时间比上面指定的两个方法?

1 个答案:

答案 0 :(得分:1)

我会尝试回答你的问题:

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