Im Rahmen eines Auftrags, einer meiner Professoren hat mir Code, der Art wie folgt aussieht:Was bewirkt dieser thread_local RNG-Samen?
namespace
{
thread_local unsigned seed; // for use with rand_r
void run_custom_tests() {
// set this thread's seed
seed = 0;
// insert some random numbers into a map
std::map<int, int> m;
for (int i = 0; i < key_max; ++i)
m.insert(i, rand_r(&seed));
auto random_operations = [&]()
{
// do more stuff with rand_r(&seed)
};
std::thread t1(random_operations);
std::thread t2(random_operations);
t1.join();
t2.join();
}
} // end anonymous namespace
void test_driver()
{
run_custom_tests();
}
Meine Frage ist, was ist der Zweck dieser thread_local
Samen? Ich verstehe, dass Sie nicht zulassen können, dass zwei Threads auf dieselbe globale Variable zugreifen. Aber warum nicht einfach lokal? Da seed
nur zum Füllen dieser Map und innerhalb des Lambda verwendet wird und jeder Thread seinen eigenen Stack hat, würde eine lokale Variable nicht dasselbe Ziel erreichen?
Ich war gut in der Zuordnung, da der Punkt war nicht zu verstehen, diese Verwendung von thread_local
. Aber ich bin immer noch verwirrt von diesem Aspekt des Programms.
Eine lokale Variable innerhalb 'random_operations' erklärt, ja. Wenn es im äußeren Geltungsbereich deklariert ist, würden diese Threads es teilen, weil Lambda es als Referenz erfasst. – milleniumbug
Ist diese Funktion die einzige, in der Sie Zufallszahlen generieren, und wird sie nur * einmal * im gesamten Programm aufgerufen (einmal während der Ausführung des Programms, nicht an einer Stelle im Code)? Wenn ja, macht das keinen Unterschied. Sonst beeinflussen die vorherigen Werte die nächsten ... – deviantfan
@milleniumbug, also würde das Ändern des Lambda, um "Samen" nach Wert zu erfassen, dieses Problem lösen? – Max