Я бы вместо этого использовал потоки C++ 11, потому что это проще для новичков.
Вот код.
double PiComputation::Random(){
std::lock_guard<std::mutex> lock(mut_rand);
return ((double)dis(gen)/ (double) INT32_MAX);
}
double PiComputation::computePiSubTask(int nbSimuls){
double x, y;
auto nbOk=0;
for (int i=0;i<nbSimuls;++i){
x=Random();
y=Random();
if (x*x+y*y <1){
nbimulsOk++;
}
}
return nbOk;
}
double PiComputation::ComputePi(){
nbimulsOk=0;
int nbSubTaks=2;
int nbSimuls1=N/2;
int nbSimuls2=N-N/2;
std::thread first (&PiComputation::computePiSubTask, this, nbSimuls1);
std::thread second (&PiComputation::computePiSubTask, this, nbSimuls2);
first.join();
second.join();
return 4*nbimulsOk/(double) N;
}
PiComputation::PiComputation(void):N(100000000)
{
gen=std::mt19937 (rd());
dis= std::uniform_int_distribution<> (1, INT32_MAX);
}
PiComputation::~PiComputation(void){
}
выход при вызове его: 3,1416770800000000
Обратите внимание, что есть замок на генератор случайных чисел, так что это многопоточный, но это может быть МЕДЛЕННЕЕ из-за его узкое
заменить/(двойной) N с константой * idN и заменить pow с x * x и заменить (double) INT_MAX двойной константой, чтобы иметь большую скорость перед многопоточным чтением. –
Имейте один локальный аккумулятор на поток и результат результата в конце. –
Почему вы делите INT_MAX? Этот алгоритм работает вообще? –