2014-11-15 50 views
2

对于标准C++ 11和/或在一般情况下,以下推理是否正确?无锁线程池

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

还是我错过了一些操作系统机制,这将使它成为可能?你能否提供额外的推理,表明不存在无锁非繁忙循环线程池?

+0

这个无锁定线程池https://github.com/tghosgor/threadpool11在饱和情况下是无锁的,但在没有工作时使用std :: condition_variable/std :: mutex。 –

回答

2

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

我并不是100%确定它不可能提供某些东西,但总的来说,一个线程正在运行,或者它由操作系统等待某些东西。就我所知,“等待操作系统中的某些东西”总是某种“锁定”。

但是,这里的关键是:

如果在有“无工做”是真的有问题,那么你或许应该重新考虑你的整体线程池的使用,而不是尝试的情况下锁卸下锁。也许更大的数据包需要通过“为线程提供工作”来完成。