如何探测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();

然后从设备只是waitS对于condition_variablenotify编。我们添加了atomic<bool>正义以避免虚假唤醒。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何探测std :: mutex?

来自分类Dev

std :: mutex的线程安全

来自分类Dev

std :: mutex锁定的顺序

来自分类Dev

std :: mutex锁定的顺序

来自分类Dev

std::mutex 使用示例

来自分类Dev

如何std :: mutex :: lock直到函数返回

来自分类Dev

如何断言std :: mutex是否已锁定?

来自分类Dev

如何安全删除成员std :: mutex?

来自分类Dev

使用std :: mutex复制类

来自分类Dev

std :: mutex的访问器函数

来自分类Dev

std :: lock_guard如何比std :: mutex :: lock()更快?

来自分类Dev

boost :: shared_mutex比Linux上的std :: mutex慢

来自分类Dev

boost :: shared_mutex比Linux上的std :: mutex慢

来自分类Dev

如何设计可变的Mutex集合?

来自分类Dev

用std :: vector <mutex *>调用std :: lock()

来自分类Dev

std :: thread和std :: mutex问题

来自分类Dev

为什么std :: mutex比std :: atomic快?

来自分类Dev

std :: mutex无法正确锁定std :: cout

来自分类Dev

用std :: vector <mutex *>调用std :: lock()

来自分类Dev

std :: mutex无法正确锁定std :: cout

来自分类Dev

如何将&Vector <Mutex>转换为Vector <Mutex>

来自分类Dev

如何使用boost :: mutex作为std :: map中的映射类型?

来自分类Dev

std::mutex 如何在不同线程中解锁?

来自分类Dev

用std :: mutex实现类的交换

来自分类Dev

用std :: mutex实现信号量

来自分类Dev

什么是std :: mutex阻止线程修改?

来自分类Dev

通过订购std :: mutex避免死锁

来自分类Dev

使用 boost 链和 std::mutex

来自分类Dev

std :: mutex锁定功能和std :: lock_guard <std :: mutex>之间的区别?