如果互斥锁已锁定,则可以安全地跳过任务

我在围绕互斥锁/锁的问题上苦苦挣扎。 情况:

  • 有任务A花费相对较长的时间。它在一个线程中不定期执行(但一次只能执行一次)。
  • 有任务B,它很快,并且经常从另一个线程中调用。
  • 这两个任务在相同的内存上工作,因此不应同时执行。
  • 至关重要的是,任务B不要等待任务A,因为上下文是渲染后与GPU的通信(纹理传输),并且由于任务A可能需要几个帧,因此这将导致帧滞后。
  • 相反,如果任务A当前正在运行,则应仅跳过任务B。
  • 但是,永远不要跳过任务A

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

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

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

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

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

真的真的那么容易吗,还是我错过了什么?在过去烦人的多线程错误之后,我对这个主题变得不安全。 在此先感谢。

评论
99.90%
99.90%

您的代码是正确的,但是出于例外安全性和防止资源泄漏的考虑,您最好在任务B中使用RAII。一般规则是“使用RAII锁防护(lock_guard,unique_lock,shared_lock),切勿调用Mutex.lock和Mutex.unlock直接(RAII)”。

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