簡體   English   中英

這個 thread_local RNG 種子有什么作用?

[英]What does this thread_local RNG seed accomplish?

作為作業的一部分,我的一位教授給了我看起來像這樣的代碼:

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();
}

我的問題是thread_local種子的目的是什么? 我知道您不能允許兩個線程訪問同一個全局變量。 但為什么不把它本地化呢? 由於seed僅用於填充該映射和 lambda 內部,並且每個線程都有自己的堆棧,所以局部變量不會實現相同的目標嗎?

我在作業上做得很好,因為重點不是理解thread_local這種用法。 但我仍然對程序的這一方面感到困惑。

從 linux 文檔:

與 rand() 一樣,rand_r() 返回范圍為 [0, RAND_MAX] 的偽隨機整數。 seedp 參數是一個指向用於在調用之間存儲狀態的 unsigned int 的指針。

在文檔的前面提到randrand_r不是線程安全的。

因此,每個線程必須分離狀態,或者必須使用互斥鎖保護調用。

參考: http : //linux.die.net/man/3/rand_r

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM