如何探测std::mutex?

How to probe std::mutex?

我有两个线程。两者都在与 GPU 对话。第一个负责渲染另一个加载东西。当第一个真正渲染而不做其他事情时,第二个必须停止。它们可以 运行 并行,但这会引入帧率峰值。所以在加载线程中做一个循环是可以的,但不能再多了。我用 std::mutex 实现了这种行为,但我不喜欢它,因为第二个线程实际上是在切换互斥锁,可能会减慢渲染线程的速度。如何以更简洁的方式实施?

//Master thread
{
    std::lock_guard<std::mutex> lg(gpuMutex);
    // rendering
}

//Slave thread
while(!toLoadQueue.isEmpty()) {
    gpuMutex.lock();
    gpuMutex.unlock();
    // loading
}

编辑: 我的(蓝色)和@barry 的(红色)代码的比较。 (尖峰越少越好)

线程行为的可视化。

我会使用 condition_variableatomic<bool>:

// in master
available = false;
std::lock_guard<std::mutex> lock(gpuMutex);
// [ do stuff ... ]
// ok ready to let go
available = true;
cv.notify_one();

奴隶然后 waitcondition_variable 上被 notifyed。我们添加 atomic<bool> 只是为了避免虚假唤醒。

// in slave
std::unique_lock<std::mutex> lock(gpuMutex);
cv.wait(lock, [&]{ return available.load(); });