我试图在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 时间太慢,请切换为收率。