如果互斥锁被锁定,安全地跳过任务

Safely skip an task if mutex is locked

我正在努力思考 mutexes/locks。 情况:

到目前为止我所拥有的: 任务 A 的线程(不定期调用):

{
  std::unique_lock<std::mutex> mlock(the_mutex);
  TaskA();
}

和任务 B(挂接到渲染线程)

{
  if mutex.try_lock()
  {
    TaskB();
    the_mutex.unlock();
  }
}

The_mutex是对象的常用std::mutex。

一次真的那么容易,还是我漏掉了什么?在过去烦人的多线程错误之后,我对这个话题变得不安全了。 非常感谢。

您的代码是正确的,但为了异常安全和防止资源泄漏,您最好在任务 B 中使用 RAII。一般规则是 "Use RAII lock guards (lock_guard, unique_lock, shared_lock), never call mutex.lock and mutex.unlock directly (RAII)"。

std::unique_lock<std::mutex> mlock(the_mutex, std::defer_lock);
if (mlock.try_lock()) {
    TaskB();
}

std::unique_lock<std::mutex> mlock(the_mutex, std::try_to_lock);
if (mlock) {
    TaskB();
}