这里的要点是知道实现等待循环的更有效的解决方案,该循环在每次迭代中轮询一个条件。通过高效,我的意思是"高效的CPU调度"。
我知道我的代码中使用的等待条件不是"真正的等待条件"使用女巫" wakeOne" /" wakeAll"但是我想知道使用伪等待条件对CPU来说比睡眠更有效。
这是两个代码片段,它们做同样的事情:等到事情发生。此代码用于工作线程池中。因此,当一个线程等待时,其他人(或其他一些人)应该处理他们的指令。
第一次使用"睡眠",第二次使用"等待条件"。 它们是用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
答案 0 :(得分:6)
<强>编辑:强>
两个版本都是相同的,因为“阻塞”或“暂停”(即 - 从调度程序中的“runnable”列表中删除它)调用线程。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_timedwait.html
在休眠期间等待CV时,线程不会使用CPU的任何时钟周期。
<强> ORIGINAL:强>
差异很大。第一个示例(带睡眠)将对0-100ms内的事件做出反应。另一个 - 带条件变量 - 将“立即”反应。那是因为睡眠就是这样 - 睡觉你请求的确切时间(注意 - 让我们假设你的系统不使用POSIX风格的信号)。另一方面,条件变量将等待您请求,除非它收到条件可能已更改的通知。