Używam nowych generatorów liczb losowych w C++ 11. Chociaż istnieją różne opinie, z tego thread wydaje się, że większość uważa, że nie są bezpieczne dla wątków. W konsekwencji chciałbym stworzyć program, w którym każdy wątek używa własnego RNG.jak sprawić, aby każdy wątek używał własnego RNG w C++ 11
Przykład jest podany w odpowiednim omówieniu sposobu osiągnięcia tego z OpenMP:
#include <random>
#include <iostream>
#include <time.h>
#include "omp.h"
using namespace std;
int main()
{
unsigned long long app = 0;
{
//mt19937_64 engine((omp_get_thread_num() + 1)); //USE FOR MULTITHREADING
mt19937_64 engine; //USE FOR SINGLE THREAD
uniform_real_distribution<double> zeroToOne(0.0, 1.0);
//#pragma omp parallel for reduction(+:app) //USE FOR MULTITHREADING
for (unsigned long long i = 0; i < 2000000000; i++)
{
if(zeroToOne(engine) < 0.5) app++;
}
}
cout << app << endl;
return 0;
}
Kiedy uruchomić wielowątkowe i jednowątkowych wersję tego programu i śledzić w czasie, tyle samo czasu, aby zakończyć po wykonaniu. Ponadto, app
nie ma tego samego rozmiaru w obu przypadkach, ale podejrzewam, że jest to tylko z powodu różnych nasion.
Pytanie: Czy podany przykład poprawnie pokazuje, jak zmusić każdy wątek do używania własnego RNG? Jeśli nie, czy mogę zobaczyć przykład tego, jak to się robi, lub uzyskać odniesienie do miejsca, w którym wyjaśniają, jak to osiągnąć?
Dziękuję za ten przykład, który jest bardzo pomocny. Mam dwa pytania: (1) Czy mogę zapytać, dlaczego wybrałeś włączenie ': engines()'? Ściśle mówiąc, czy to jest wymagane? .... (2) Czy mogę używać obiektu 'rand' w późniejszej pętli w moim programie, który nie jest zrównoleglony? – BillyJean
@BillyJean (1) Nie jest wymagane, ale mój osobisty styl wywoływania każdego elementu ctor na liście inicjalizatora, jeśli przynajmniej jeden jest wywoływany. (2) Nie w 100% pewny, ale myślę, że 'omp_get_thread_num()' zwraca 0 dla nierównoległego regionu, więc Tak. – hansmaad
Ostatnie pytanie: Powiedz, że robię globalne 'RNG' i jego obiekt' rand' globalny. Zamiast warunkowego '(rand() <0.5)' teraz nazywam globalną funkcją 'func', która wykonuje pewne obliczenia zależne od' rand'. Czy użycie 'rand' w' func' nadal będzie bezpieczne dla wątków? Powiedziałbym "tak", ale chciałbym usłyszeć także twoją profesjonalną opinię. – BillyJean