这个thread_local RNG种子完成了什么?

时间:2016-04-26 00:48:52

标签: c++ multithreading random thread-local

作为一项任务的一部分,我的一位教授给了我类似的代码:

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的这种用法。但我仍然对该计划的这方面感到困惑。

1 个答案:

答案 0 :(得分:0)

来自linux文档:

  

与rand()类似,rand_r()返回[0,RAND_MAX]范围内的伪随机整数。 seedp参数是指向unsigned int的指针,用于在调用之间存储状态

在文档的前面部分提到randrand_r不是线程安全的。

因此,每个线程必须分开状态,或者必须使用互斥锁保护调用。

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