Nein C++ std
Typ verwendet globale Daten in einer nicht Thread-sicheren Weise. Auf zwei nicht verwandte Instanzen eines solchen Typs kann in verschiedenen Threads zugegriffen werden.
Standardmäßig kann auf eine Instanz eines Typs von zwei Threads ohne Synchronisierung nicht zugegriffen werden.
Sie sind lokale Variablen erstellt. Diese lokalen Variablen sind mit keiner anderen Instanz ihres Typs verwandt. Hier gibt es keine Threadsicherheitsprobleme.
Pseudozufallswerte werden am effizientesten durch den Status und die Wiederverwendung erzeugt. Sie tun dies nicht, also ist Ihre Zufallszahl von 1 bis 6 relativ teuer zu erstellen.
std::random_device seeder;
std::mt19937 engine(seeder());
std::uniform_int_distribution<int> dist(1, 6);
return dist(engine);
Ihre Verwendung von std::mt19937
ist redundant. Sie erstellen bereits eine random_device
, die direkt an dist
weitergeleitet werden kann, und erstellt dann eine engine
daraus und dann die engine
. Die Verwendung von engine
hier ist nutzlos.
Traditionsgemäß Sie schaffen eine engine
(einer Art, wie mt19937
) einmal von einem seeder
.Sie speichern dann die engine
und übergeben sie wiederholt an Distributionen.
Dies macht die relativ teure "echte Zufallsgenerierung" einmal, um über die Engine durch Verteilung eine lange Reihe von Pseudozufallszahlen zu generieren.
Beachten Sie jedoch, dass eine solche Verwendung einen Preis hat; Sie müssen die engine
speichern und Sie müssen Mehrfach-Thread-Zugriff darauf verhindern.
Der "richtige" Weg, dies zu tun, ist, ein Objekt zu haben, das zufällige Werte für Sie erzeugt und es dort herumgibt, wo Sie es brauchen. Das Speichern des ursprünglichen Startwerts würde es Ihnen auch ermöglichen, die Ausführung der betreffenden Zufallszahl zu wiederholen.
Wenn Sie die Idee nicht mögen, Ihren zufälligen Zustand explizit zu umgehen, könnten Sie eine (oder static
mit einer mutex
Wache) verwenden.
thread_local std::mt19937 engine(std::random_device{}());
std::uniform_int_distribution<int> dist(1, 6);
return dist(engine);
Dies schafft eine engine
pro Faden, und die engine
mit einem Wert von Ihrem random_device
initialisiert wird.
Warum das "C" -Tag? Das hat nichts mit C. zu tun. – UnholySheep
Ich verstehe nicht wirklich, warum ich downvotes bekomme. Ich frage, ob das Gewinde sicher ist und ob es nicht nötig ist, den Samen zu erneuern. – cateof
Wahrscheinlich wegen ähnlicher Fragen mit langen und detaillierten Antworten? –