如果互斥锁被锁定,安全地跳过任务
Safely skip an task if mutex is locked
我正在努力思考 mutexes/locks。
情况:
- 有任务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。一般规则是 "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();
}
我正在努力思考 mutexes/locks。 情况:
- 有任务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。一般规则是 "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();
}