这个代码块
try
{
for(int i=0;i<N;i++)
{
std::shared_ptr<std::random_device> tmp=std::shared_ptr<std::random_device>(new std::random_device);
rdThread.push_back(tmp);
rngThread.push_back(std::mt19937((*rdThread[rdThread.size()-1])()));
distThread.push_back(std::uniform_real_distribution<T>(0,1));
}
}
catch(std::exception & ex)
{
std::cout<<ex.what()<<std::endl;
}
当 N 为 2000 或类似的高值时产生异常。运行时异常的错误信息是:
random_device::random_device(const std::string&)
Segmentation fault (core dumped)
我找不到错误是否与 random_device 使用的一些 std::string 或 gcc 对此数字生成器的内部限制有关。但是 push_back 进入向量或在下一个 push_back 中取消引用似乎以某种方式使用它。
编译器是否可能不支持数千个随机数生成器?
rdThread
是 (shared_ptr)random_device 向量。
rngThread
是 mt19937 的向量。
distThread
是均匀实数分布的向量。
在多线程部分中,少于 2000 个项目的所有项目都可以正常工作,但此错误仅在此初始化块上。
- g++ (Ubuntu 5.4.1-2ubuntu1~16.04) 5.4.1
- C++1y 方言开启
- 优化 O3 开启
- -m64 -mtune=包含通用编译选项