Threadpool实现:condition_variables vs. yield()

时间:2013-07-12 11:16:35

标签: 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();
    }
}

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 );
    }
}

有什么想法吗?两个版本之间是否会有任何性能差异?

2 个答案:

答案 0 :(得分:9)

如果线程池中的线程经常被提供任务并且你需要快速的响应时间,那么yield就是你想要的,但是无论等待线程在做什么,yield都会烧掉cpu周期。 如果没有,你可以使用条件方法,线程将睡眠,直到任务准备就绪(注意,条件可以唤醒一个线程,即使没有发送就绪信号),响应时间可能会更慢,但你不会烧cpu cycles。

我会推荐条件方法,如果反应时间太慢,请切换到收益。

答案 1 :(得分:6)

线程切换的成本无论哪种方式都是相同的。至于你是否应该使用轮询或条件变量,后者可以通过踢掉线程来休息处理器,直到确实有事情要做。这导致CPU利用率降低。轮询方法将允许线程返回并“再次尝试”,有效地无限运行CPU。

值得指出的是,有一些应用程序更喜欢轮询,例如task_available在很短的时间内是假的(即通常有工作要做)。在这种情况下,您需要在带有计数器的循环中轮询task_available;只有当计数器超过阈值时才会产生线程。