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可变,因为它会修改自己的状态。也许他不想解释那部分语言?