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

问题描述 投票:0回答:1

我为在互斥锁/锁周围弯曲我的思维而苦苦挣扎。情况:

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

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

c++ multithreading mutex
1个回答
0
投票

您的代码正确,但是您最好在任务B中使用RAII。

std::unique_lock<std::mutex> mlock(the_mutex, std::defer_lock);
if (mlock.try_lock()) {
    TaskB();
}
© www.soinside.com 2019 - 2024. All rights reserved.