【发布时间】:2017-07-02 12:48:18
【问题描述】:
编辑:
这里的重点是了解实现等待循环的更有效的解决方案,该循环在每次迭代时轮询一个条件。高效,我的意思是“高效的 CPU 调度”。
我知道我的代码中使用的等待条件不是使用“wakeOne”/“wakeAll”指令的“真正等待条件”,但我想知道使用假等待条件是否比 CPU 更有效睡一觉。
原帖:
这里有 2 个代码 sn-ps,它们做同样的事情:等到有事情发生。此代码用于工作线程池。因此,当一个线程等待时,其他线程(或其他一些线程)应该处理它们的指令。
第一个使用“睡眠”,第二个使用“等待条件”。 它们是用 Qt 编写的,但可以轻松转换为 C++11、Boost 或任何线程库。
两者都运作良好,但有任何性能差异吗?我记得我在某处读过:
“睡眠”会导致主动等待,因此 CPU 会花时间等待。
“等待条件”使 CPU 等待一个事件,因此 CPU 在等待期间切换到另一个线程执行
我记得很清楚吗?真的吗 ?使用等待条件并行执行多个线程更有效?
“睡眠”版本:
while (someCondition == false)
{
sleep(100);
}
// Do some work
“WaitCondition”版本:
QMutex mutex(QMutex::NonRecursive);
QWaitCondition waitCondition;
while (someCondition == false)
{
QMutexLocker locker(&mutex);
waitCondition.wait(&mutex, 100);
}
// Do some work
【问题讨论】:
-
""sleep" 导致主动等待,因此 CPU 花时间等待。" False.
-
你能指出一些关于睡眠/等待条件的文档来确认吗?
-
@Jarod42 我认为 OP 意味着他的“睡眠”解决方案在轮询条件时会做一些(轻度)忙等待......
-
我认为效率非常依赖于系统。我相信,一旦我看到条件变量的 wait() 函数的实现之一,只需睡眠 20 毫秒并检查条件
标签: c++ multithreading async-await