为什么boost::shared_mutex无法阻塞超128个线程,是否为已知问题?
问题结论
该问题属于Boost 1.67版本Windows平台下的已知共性问题,并非业务代码逻辑错误导致。
根因说明
- Boost 1.67版本对Windows平台的
boost::shared_mutex采用了SRW锁+内部等待计数的实现逻辑,代码硬编码了最大等待线程数为128,当等待独占锁的线程数超过该阈值时,会触发内存越界访问或断言失败,直接导致程序崩溃。 - 该问题仅存在于Boost 1.66~1.68的Windows平台版本,类Unix平台下的
boost::shared_mutex实现无该硬编码限制,不会触发同类崩溃。
复现代码
boost::shared_mutex mutex; for (int i = 0; i < 256; i++) { std::thread([&]() { printf("begin\n"); { // 运行到第128次等待时触发崩溃 boost::unique_lock<boost::shared_mutex> lock(mutex); Sleep(5000); } printf("end\n"); }).detach(); } Sleep(5000);
修复方案
- 方案1:升级Boost版本到1.69及以上,官方在1.69版本重写了Windows平台下shared_mutex的等待队列逻辑,移除了128线程的上限限制,直接解决该问题。
- 方案2:替换锁实现,无读写分离需求时可直接用
boost::mutex替代boost::shared_mutex;如果必须使用读写锁,VS2015已经支持C++17标准的std::shared_mutex,可直接替换boost的实现规避问题。 - 方案3:若必须停留在Boost 1.67版本,可手动修改Boost源码中
boost/thread/win32/shared_mutex.hpp文件的最大等待数宏定义,调整到业务需要的数值后重新编译Boost库即可生效。
内容的提问来源于stack exchange,提问作者wwc
相关产品推荐
相关产品推荐

