我正在尝试将多线程包含在我的程序中,该程序显示在线程的末尾。我在使用 RNG 的部分时遇到了一些困难boost/random
。我正在使用 OpenMP 进行多线程处理。我可以理解 Boost 的变量生成器不支持安全多线程,但我正在努力寻找解决方法,到目前为止还没有运气。请注意,该函数norm
稍后会在我的程序中使用,但这次是在单个线程上。我提到这一点,因为它可能会排除一些解决方案(或者可能不会)..
到目前为止我自己的方法:我#pragma omp critical
在生成数字之前尝试过使用安全防护,但在这种情况下,多线程不会提高计算速度(我已经比较了时间......)
我特意发布了我的问题的最简单版本,因此如果需要,可以说明解决方案。即使我使用的是 OpenMP,我也愿意切换到 Boost.Thread,如果在那里更容易实现,我会看到一些进展。
编辑我已经阅读了多个地方,为每个线程创建一个 RNG 实例是一种选择,但我很高兴看到如何在实践中做到这一点。
感谢您提前参与。
#include <iostream>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>
#include <time.h>
using namespace std;
int main()
{
boost::mt19937 engine(static_cast<unsigned int>(0));
boost::normal_distribution<double> dis(0.0, 1.0);
boost::variate_generator< boost::mt19937, boost::normal_distribution<double> > norm(engine, dis);
unsigned long long app=0;
unsigned long long i;
#pragma omp parallel for private(i) reduction(+:app)
for(i=0; i<1234567890; i++)
{
double temp = norm();
if(temp < 0.5) app++;
}
cout << app << endl;
return 0;
}