如何在try_lock_for中使用lock_guard

时间:2014-04-19 06:58:36

标签: c++ boost boost-mutex

我可以使用boost::lock_guard获取boost::mutex对象的锁定,此机制将确定一旦boost::lock_guard超出范围,锁定将被释放:

{
  boost::lock_guard<boost::mutex> lock(a_mutex);
  // Do the work
}

在这种情况下,无论代码块是否被异常退出,都将释放a_mutex

另一方面,boost::timed_mutex也支持方法try_lock_for(period),例如

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) {
  // Do the work
  a_timed_mutex.unlock(); // <- This is needed!
} else {
  // Handle the acquisition failure
}

如果unlock()语句的a_timed_mutex块出现异常,则此代码不会true if

问题: Boost(据我所知,C ++ 11标准)似乎没有提供与{{1}一起使用的lock_guard变体}或try_lock()。处理第二种情况的“推荐”方式或最佳做法是什么?

2 个答案:

答案 0 :(得分:13)

您可以在锁定后创建锁定保护,告诉它采用锁定:

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) {
  boost::lock_guard<boost::mutex> lock(a_timed_mutex, boost::adopt_lock_t());
  // Do the work
} else {
  // Handle the acquisition failure
}

标准lock_guard也允许这样做。

答案 1 :(得分:-1)

尝试unique_lock,unique_lock :: try_lock_for()