hea*_*der 12 c++ multithreading stl std condition-variable
我尝试在C++中开发一个线程池,我想知道在工作线程的主循环中产生()线程或者在条件变量上等待是否更好:
void worker_thread( void )
{
// this is more or less pseudocode
while( !done )
{
if( task_available )
run_task();
else
std::this_thread::yield();
}
}
Run Code Online (Sandbox Code Playgroud)
与
void worker_thread( void )
{
// this is more or less pseudocode
std::unique_lock< std::mutex > lk( mutex_ );
while( !done )
{
if( task_available )
run_task();
else
condition_.wait( lk );
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?两个版本之间是否会有任何性能差异?
如果线程池中的线程不断地提供任务并且您需要快速响应时间,那么yield就是您想要的,但无论等待线程在做什么,yield都会烧掉cpu周期.如果没有,你可以使用条件方法,线程将睡眠,直到任务准备就绪(注意,条件可以唤醒一个线程,即使没有发送就绪信号),响应时间可能会更慢,但你不会烧cpu周期.
我会推荐条件方法,如果反应时间太慢,请切换到收益率.
无论哪种方式,线程切换的成本都是相同的.至于你是否应该使用轮询或条件变量,后者可以通过踢掉线程来休息处理器,直到确实有事情要做.这导致CPU利用率降低.轮询方法将允许线程返回并"再次尝试",从而有效地无限运行CPU.
值得指出的是,有一些应用程序更喜欢轮询,例如在task_available
非常短的时间内是假的(即通常有工作要做).在这种情况下,您将需要task_available
使用计数器循环轮询; 仅在计数器超过阈值时才产生线程.
归档时间: |
|
查看次数: |
1916 次 |
最近记录: |