将std :: lock_guard与try_lock一起使用

Mr.*_*son 26 c++ multithreading mutex c++11

有没有一种方法,我可以告诉std::lock_gaurd打电话try_lock,而不是lock当它获取该互斥锁?

我能想到的唯一方法是使用std::adopt_lock:

if (!_mutex.try_lock())
{
    // Handle failure and return from the function
}
std::lock_guard<my_mutex_class> lock(_mutex, std::adopt_lock);
Run Code Online (Sandbox Code Playgroud)

是否有针对我的问题的内置解决方案,而不是明确获取锁定,然后lock_guard负责释放它?

T.C*_*.C. 53

基本设计不变量lock_guard是它始终保持锁定.这可以最大限度地减少开销,因为它的析构函数可以无条件地调用unlock(),并且它不必存储额外的状态.

如果您需要try-to-lock行为,请使用unique_lock:

std::unique_lock<std::mutex> lock(_mutex, std::try_to_lock);
if(!lock.owns_lock()){
    // mutex wasn't locked. Handle it.
}
Run Code Online (Sandbox Code Playgroud)

  • @iliis,你的意思是,这个问题到底想避免什么? (3认同)
  • 您可以按如下方式使用 std::lock_guard: `if (_mutex.try_lock()) { std::lock_guard&lt;std::mutex&gt; lock(_mutex, std::adopt_lock); } `(来自 /sf/answers/2131992831/) (2认同)
  • 是的,是的。我也应该阅读问题,而不仅仅是答案...... *捂脸* (2认同)
  • 我个人更喜欢 if(auto lock = std::unique_lock{_mutex, std::try_to_lock) { do_stuff(); }` (2认同)