我有两个主题。两者都在谈论GPU。第一个负责渲染另一个用于加载东西。当第一个实际渲染而不做其他事情时,第二个必须停止。它们可以并行运行但会引入帧速率峰值。所以可以在加载线程中创建一个循环,但不能再做了。我用std :: mutex实现了这个行为但是我不喜欢它,因为第二个线程实际上是在切换互斥锁并且可能减慢渲染线程的速度。如何以更清洁的方式实施?
//Master thread
{
std::lock_guard<std::mutex> lg(gpuMutex);
// rendering
}
//Slave thread
while(!toLoadQueue.isEmpty()) {
gpuMutex.lock();
gpuMutex.unlock();
// loading
}
修改 我的(蓝色)和@ barry(红色)代码的比较。 (少穗更好)
可视化线程的行为方式。
答案 0 :(得分:3)
我会使用condition_variable
和atomic<bool>
:
// in master
available = false;
std::lock_guard<std::mutex> lock(gpuMutex);
// [ do stuff ... ]
// ok ready to let go
available = true;
cv.notify_one();
奴隶然后wait
上的condition_variable
为notify
。我们添加atomic<bool>
只是为了避免虚假的唤醒。
// in slave
std::unique_lock<std::mutex> lock(gpuMutex);
cv.wait(lock, [&]{ return available.load(); });