You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么boost::shared_mutex无法阻塞超128个线程,是否为已知问题?

Boost 1.67 + MSVC2015 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:54:00