无锁线程池

时间:2014-11-15 09:43:51

标签: c++ multithreading c++11 threadpool

以下推理在标准C ++ 11和/或一般情况下是否正确?

实现线程池时,通常不希望忙于循环那些没有工作要做的线程。因此,需要某种std :: condition_variable。因此,需要某种std :: mutex。因此,不可能有一个无锁的线程池(不忙循环)。

或者我错过了一些可以实现的操作系统机制?您是否可以提供其他推理,表明不存在无锁非繁忙循环线程池?

1 个答案:

答案 0 :(得分:2)

如果您允许忙碌等待,那当然是完全可能的。但是,如果没有忙碌的等待,你需要操作系统的帮助 - 它不必是互斥体,它当然可以是readpollWaitForMultipleObject(在Windows中) )或OS提供的其他“等待某事”功能。

我不是百分之百确定提出某些东西是不可能的,但一般来说,一个线程正在运行,或者它被等待某事的操作系统所持有。据我所知,“等待操作系统中的某些东西”总是某种“锁定”。

然而,关键在于:

如果在“无工作”的情况下锁定确实是一个问题,那么您可能应该重新考虑整体线程池使用情况,而不是尝试删除锁定。也许更大的数据包需要通过“为线程提供工作”来组合在一起。