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

标签 c++ multithreading mutex

我正在努力解决互斥/锁问题。 情况:

  • 任务 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。

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

最佳答案

您的代码是正确的,但为了异常安全和防止资源泄漏,您最好在任务 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();
}

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

关于c++ - 如果互斥锁被锁定,安全地跳过任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61857306/

相关文章:

java - 如何在单页 PDF 中打印多个 jasper 报告

java - java 中的暂停、恢复和停止线程

c++ - C++17 std::shared_mutex 还不可用吗?

c++ - 使用 C++ 提交表单的 Http GET 请求

c++ - 程序正在读取太多的小数点

c - 在随机条件下的无限 while 循环中创建读取器和写入器线程时出现段错误

go - 什么是 golang 中的同步(sync.RWMutex)

c++ - 为什么 boost::recursive_mutex 没有按预期工作?

c++ - Qt 接口(interface)类

c++ - 如何将最终迭代添加到 while 循环?