如何探测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_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
ed。我们添加 atomic<bool>
只是为了避免虚假唤醒。
// in slave
std::unique_lock<std::mutex> lock(gpuMutex);
cv.wait(lock, [&]{ return available.load(); });
我有两个线程。两者都在与 GPU 对话。第一个负责渲染另一个加载东西。当第一个真正渲染而不做其他事情时,第二个必须停止。它们可以 运行 并行,但这会引入帧率峰值。所以在加载线程中做一个循环是可以的,但不能再多了。我用 std::mutex 实现了这种行为,但我不喜欢它,因为第二个线程实际上是在切换互斥锁,可能会减慢渲染线程的速度。如何以更简洁的方式实施?
//Master thread
{
std::lock_guard<std::mutex> lg(gpuMutex);
// rendering
}
//Slave thread
while(!toLoadQueue.isEmpty()) {
gpuMutex.lock();
gpuMutex.unlock();
// loading
}
编辑:
我会使用 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
ed。我们添加 atomic<bool>
只是为了避免虚假唤醒。
// in slave
std::unique_lock<std::mutex> lock(gpuMutex);
cv.wait(lock, [&]{ return available.load(); });