作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于标准 C++11 和/或在一般上下文中,以下推理是否正确?
在实现线程池时,人们通常不想让那些没有工作可做的线程忙于循环。因此,需要某种 std::condition_variable。因此,需要某种 std::mutex。因此,不可能有一个无锁线程池(没有忙循环)。
或者我是否缺少一些使它成为可能的操作系统机制?您能否提供额外的推理来表明不存在无锁非忙循环线程池?
最佳答案
如果允许忙等待,那当然是完全可以的。但是没有忙等待,你需要操作系统的帮助 - 它不一定是互斥体,它当然可以是 read
, poll
, WaitForMultipleObject
(在 Windows 中)或操作系统提供的其他“等待某事”功能。
我不是 100% 确定想出一些东西是不可能的,但一般来说,线程要么正在运行,要么被操作系统占用等待某些东西。据我所知,“等待操作系统中的某些东西”总是某种“锁”。
然而,这里的关键是:
如果在“无事可做”的情况下锁定确实是个问题,那么您可能应该重新考虑整体线程池的使用情况,而不是尝试移除锁定。也许更大的数据包需要通过任何“为线程工作”的方式放在一起。
关于c++ - 无锁线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26944538/
我是一名优秀的程序员,十分优秀!