线程睡眠VS等待条件

Aur*_*ien 5 c++ multithreading async-await

编辑:

这里的要点是知道实现等待循环的更有效的解决方案,该循环在每次迭代中轮询一个条件.通过有效,我的意思是"有效的CPU调度".

我知道我的代码中使用的等待条件不是"wakeOne"/"wakeAll"指令所使用的"实际等待条件",但我想知道使用伪等待条件对CPU来说比睡眠更有效.

原帖:

这里有两个代码片段,它们做同样的事情:等到事情发生.此代码用于工作线程池中.因此,当线程等待时,其他人(或其他一些人)应该处理他们的指令.

第一个使用"睡眠",第二个使用"等待条件".它们是用Qt编写的,但可以很容易地翻译成C++ 11,Boost或任何线程库.

两者都运作良好,但有任何性能差异?我记得我在某处读过:

"睡眠"导致主动等待,因此CPU花费时间等待.

"等待条件"使CPU等待事件,因此CPU在等待期间切换到另一个线程执行

我记得很清楚吗?真的吗 ?使用等待条件更有效地并行执行多个线程?

"睡眠"版本:

while (someCondition == false)
{
    sleep(100);
}

// Do some work
Run Code Online (Sandbox Code Playgroud)

"WaitCondition"版本:

QMutex mutex(QMutex::NonRecursive);
QWaitCondition waitCondition;

while (someCondition == false)
{
    QMutexLocker locker(&mutex);
    waitCondition.wait(&mutex, 100);
}

// Do some work
Run Code Online (Sandbox Code Playgroud)

Fre*_*pin 7

编辑:

两个版本都是相同的,因为"阻塞"或"暂停"(即 - 从调度程序中的"runnable"列表中删除它)调用线程.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/sleep.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_cond_timedwait.html

在睡眠期间等待CV,线程不使用CPU的任何时钟周期.

原版的:

差异很大.第一个示例(带睡眠)将对0-100ms内的事件做出反应.另一个 - 带条件变量 - 将"立即"反应.那是因为睡眠就是这样 - 睡觉你请求的确切时间(注意 - 让我们假设你的系统不使用POSIX风格的信号).另一方面,条件变量将等待您请求的时间,除非它收到条件可能已更改的通知.