如何在try_lock_for中使用lock_guard

use*_*472 9 c++ boost boost-mutex

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

{
  boost::lock_guard<boost::mutex> lock(a_mutex);
  // Do the work
}
Run Code Online (Sandbox Code Playgroud)

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

另一方面,a 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
}
Run Code Online (Sandbox Code Playgroud)

此代码将不会unlock()a_timed_mutex如果true该块if声明退出与异常.

问题: Boost(以及据我所知,C++ 11标准)似乎没有提供lock_guard适用于try_lock()或的变体try_lock_for(period).处理第二种情况的"推荐"方式或最佳做法是什么?

Mik*_*our 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
}
Run Code Online (Sandbox Code Playgroud)

标准的lock_guard也允许这样做.