以下推理在标准C 11和/或一般情况下是否正确?
在实现线程池时,通常不希望忙于循环那些没有工作要做的线程.因此,需要某种std :: condition_variable.因此,需要某种std :: mutex.因此,不可能有一个无锁的线程池(不繁忙循环).
或者我错过了一些可以实现的操作系统机制?您是否可以提供其他推理,表明不存在无锁的非忙循环线程池?
最佳答案 如果您允许忙碌等待,那当然是完全可能的.但是,如果没有忙碌的等待,你需要来自操作系统的帮助 – 它不一定是互斥体,它当然可以是读取,轮询,WaitForMultipleObject(在
Windows中)或其他“等待某事”功能. OS.
我不是100%确定提出某些东西是不可能的,但一般来说,一个线程要么正在运行,要么由等待某事的操作系统持有.据我所知,“等待操作系统中的某些东西”总是某种“锁定”.
但是,关键在于:
如果在“没有工作要做”的情况下锁定确实是一个问题,那么您可能应该重新考虑整体线程池使用情况,而不是尝试删除锁定.也许更大的数据包需要通过“为线程提供工作”来组合在一起.