C++11 Thread-Sicherheit von Zufallsgeneratoren
In C++11 gibt es eine Reihe neuer Random number generator-Motoren und-Verteilung Funktionen. Sie sind thread-sicher? Wenn Sie teilen sich eine einzige zufällige Verteilung und Motor zwischen mehreren threads, ist es sicher und wird Sie noch erhalten Zufallszahlen? Das Szenario, das ich Suche ist so etwas wie,
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
for (int i = 0; i < 1000; i++) {
double a = zeroToOne(engine);
}
}
Verwendung von OpenMP oder
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
double a = zeroToOne(engine);
});
}
mit libdispatch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den C++11 standard-Bibliothek ist weitgehend thread-sicher. Die thread-Sicherheit garantiert auf PRNG-Objekte das gleiche wie für Container. Genauer gesagt, da der PRNG Klassen sind alle pseudo-random, d.h. Sie erzeugen eine deterministische Sequenz basierend auf einem bestimmten ist-Zustand, es gibt wirklich keinen Raum zu spähen oder Stossen auf alles, was außerhalb der enthaltenen Zustand (das ist auch sichtbar für den user).
Nur als Container sperren müssen, um Sie sicher zu teilen, müsstest du den PRNG-Objekt. Dies würde, machen Sie es langsam und nicht deterministisch. Ein Objekt pro thread wäre besser.
§17.6.5.9 [res.auf.Daten.Rennen]:
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0)
Menge threads und verwenden Sie einen Motor pro-thread?Standard (gut
N3242
) scheint machen keine Erwähnung von random number generation, Rennen kostenlos (außer, dassrand
ist das nicht), so ist es nicht(es sei denn ich habe etwas übersehen). Außer es gibt wirklich keinen Sinn, mit Ihnen threadsave, denn es bestünde eine relativ kräftige overhead (im Vergleich zu der generation der zahlen selbst zumindest), ohne wirklich etwas gewinnen.Außerdem sehe ich nicht wirklich einen Vorteil og mit einem gemeinsam genutzten Zufallszahlengenerator auf, anstatt ein pro-thread, die jeweils geringfügig anders initialisiert (z.B. aus den Ergebnissen von einem anderen generator oder die aktuelle thread-id). Afterall, die Sie vermutlich gar nicht darauf verlassen, dass der generator die Erzeugung einer bestimmten Sequenz mit jedem Lauf sowieso. Also ich würde ändern Sie Ihren code so etwas wie dieses (für
openmp
keine Ahnunglibdispatch
):Den Dokumentation macht keine Erwähnung von thread-Sicherheit, so würde ich annehmen, dass Sie Sie nicht thread-sicher.