c++ - 为什么 boost::shared_mutex 不能阻塞超过 128 个线程?
问题描述
为什么 boost::shared_mutex 不能阻塞超过 128 个线程?这是一个众所周知的问题吗?
boost1.67+mscv2015
boost::shared_mutex mutex;
for (int i = 0; i < 256; i++)
{
std::thread([&]() {
printf("begin\n");
{ //crash after 128 times
boost::unique_lock<boost::shared_mutex> lock(mutex);
Sleep(5000);
}
printf("end\n");
}).detach();
}
Sleep(5000);
解决方案
我认为这是实施限制。来自/boost/thread/win32/shared_mutex.hpp
:
namespace boost
{
class shared_mutex
{
private:
struct state_data
{
unsigned shared_count:11,
shared_waiting:11,
exclusive:1,
upgrade:1,
exclusive_waiting:7,
exclusive_waiting_blocked:1;
//...
};
// ...
};
//...
}
看到那exclusive_waiting
是 7 位,这意味着它最多只能容纳 127 的值。
认为这个想法是使状态适合 32 位,以使其适用于有效的原子操作,即使对于 32 位 Windows 进程也是如此。
至于为什么它对于 64 位来说并不大 - 也许是为了简单起见,或者它可能支持 32 位和 64 位之间的共享内存,不确定。
要解决此问题,请考虑std::shared_mutex
,它是在 之上实现的SRWLOCK
,并且不会遇到此问题。除非您需要支持 Windows XP,否则在这种情况下不是一个选项。
(或者,作为一种解决方法,考虑避免无论如何都不太可能有效的模式,正如@sehe 评论的那样)
推荐阅读
- jquery - 如何在每个加载页面中使用下拉过滤器在 jquery 上设置默认结果?
- nginx - 上游 NGINX 无效端口
- wso2 - WSO2 API Manager 中的有效负载字段验证
- ruby-on-rails - 安装 pg (1.2.1) 时出错,Bundler 无法继续
- java - 多租户 Spring JPA:动态数据源的动态方言解析
- javascript - 期望赋值或函数调用,但在函数中看到表达式错误
- c++ - 尝试使用接口块从 V.Shader->G.Shader->F.Shader 传递信息时出现顶点着色器编译错误
- java - 无法解析符号视图
- apache-kafka - 未订阅主题的 Kafka Streams 警告
- google-app-maker - 把钥匙放在错误的记录上