2016-04-26 3 views
-1

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.

+0

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

+0

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

+0

@milleniumbug, also würde das Ändern des Lambda, um "Samen" nach Wert zu erfassen, dieses Problem lösen? – Max

Antwort

0

aus der Linux-Dokumentation:

wie rand(), rand_r() eine Pseudozufallszahl im Bereich [0, RAND_MAX]. Das Argument seedp ist ein Zeiger auf einen vorzeichenlosen int, der zum Speichern des Status zwischen den Aufrufen verwendet.

Früher in der Dokumentation erwähnt wird, dass rand und rand_r sind nicht Thread-sicher.

Daher muss der Status entweder pro Thread getrennt sein oder der Aufruf muss mit einem Mutex geschützt sein.

ref: http://linux.die.net/man/3/rand_r

+0

Ich weiß. Aber da jeder Thread seinen eigenen Stack hat, warum kann der Seed nicht einfach eine lokale Variable sein? Das habe ich in meiner Frage gefragt. – Max

+0

@Max Er hätte den Samen lokal zum Lambda haben können, aber dann müsste er das Lambda änderbar machen, weil es seinen eigenen Zustand verändern würde. Vielleicht wollte er diesen Teil der Sprache nicht erklären müssen? –

Verwandte Themen