我正在努力解决互斥/锁问题。 情况:
- 任务 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/