线程睡眠VS等待条件

时间:2017-02-14 09:41:24

标签: c++ multithreading async-await

编辑:

这里的要点是知道实现等待循环的更有效的解决方案,该循环在每次迭代中轮询一个条件。通过高效,我的意思是"高效的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

1 个答案:

答案 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风格的信号)。另一方面,条件变量将等待您请求,除非它收到条件可能已更改的通知。