我试图在C++中开发一个线程池,但我想知道在工作线程的主循环中使用yield()线程还是等待条件变量是更好的选择:

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

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

最佳答案

如果您的线程池中的线程不断地执行任务,并且需要快速的响应时间,那么yield是您想要的,但是yield会消耗cpu周期,而不管等待中的线程在做什么。
如果没有,您可以使用条件方法,线程将休眠直到任务准备就绪(尽管请注意,即使没有发送就绪信号,条件线程也可以唤醒线程),响应时间可能会变慢,但是您不会烧死cpu周期。

我建议使用有条件的方法,如果 react 时间太慢,请切换为收率。

09-05 00:09