C++ 这个线程\u本地RNG种子实现了什么?

C++ 这个线程\u本地RNG种子实现了什么?,c++,multithreading,random,thread-local,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;

作为作业的一部分,我的一位教授给了我类似这样的代码:

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();
}
名称空间
{
线程\u本地无符号种子;//用于rand\u r
无效运行自定义测试(){
//设置此线程的种子
种子=0;
//在地图中插入一些随机数
std::map m;
对于(int i=0;i
我的问题是
线程\u local
种子的目的是什么?我知道不能允许两个线程访问同一个全局变量。但为什么不让它成为本地的呢?既然
seed
只用于填充该映射和lambda内部,并且每个线程都有自己的堆栈,那么局部变量就不能实现相同的目标吗


我的作业做得很好,因为重点不是理解
thread\u local
的用法。但我仍然对程序的这一方面感到困惑。

来自linux文档:

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

在前面的文档中提到,
rand
rand\u r
不是线程安全的

因此,状态必须按线程分开,或者调用必须使用互斥锁进行保护


ref:

随机\u操作中声明的局部变量,是。如果它是在外部作用域中声明的,这些线程将共享它,因为lambda通过引用捕获它。这个函数是唯一一个生成随机数的函数,并且在整个程序中只调用一次(在运行程序时调用一次,而不是在代码中的某个位置)?如果是的话,那也没什么区别。否则,前面的值会影响下一个值…@milleniumbug,那么将lambda更改为按值捕获
种子
会解决这个问题吗?我知道。但是既然每个线程都有自己的堆栈,为什么seed不能只是一个局部变量呢?这就是我在我的问题中所问的。@Max他可以让种子在lambda本地,但是他必须使lambda可变,因为它会修改自己的状态。也许他不想解释那部分语言?