我可以使用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()
。处理第二种情况的“推荐”方式或最佳做法是什么?
答案 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()