无锁线程池

4
以下推理在标准C++11和一般情况下都是正确的吗?
当实现线程池时,通常不希望忙碌地循环那些没有工作要做的线程。因此,需要某种std::condition_variable。因此,需要某种std::mutex。因此,不可能拥有一个无锁线程池(不会忙碌循环)。
或者我是否错过了一些操作系统机制,使其成为可能?您能否提供额外的推理,表明无锁非忙碌循环线程池不存在?

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

2
如果您允许忙等待,那当然完全可能。但是如果没有忙等待,您需要从操作系统获得帮助-它不一定是互斥锁,当然也可以是由操作系统提供的“等待某些东西”的其他功能,例如readpollWaitForMultipleObject(在Windows中)或其他类似功能。

我不100%确定这是不可能的,但通常情况下,线程要么正在运行,要么被操作系统等待某些事情。就我所知,“等待操作系统中的某些事情”总是某种形式的“锁”。

然而,关键在于:

如果在“没有工作要做”的情况下使用锁确实是一个问题,那么您可能应该重新考虑整体线程池的使用方式,而不是尝试删除锁。也许“给线程分配工作”的任何东西都需要将更大的数据包放在一起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接