作为一项任务的一部分,我的一位教授给了我类似的代码:
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
的这种用法。但我仍然对该计划的这方面感到困惑。
答案 0 :(得分:0)
来自linux文档:
与rand()类似,rand_r()返回[0,RAND_MAX]范围内的伪随机整数。 seedp参数是指向unsigned int的指针,用于在调用之间存储状态。
在文档的前面部分提到rand
和rand_r
不是线程安全的。
因此,每个线程必须分开状态,或者必须使用互斥锁保护调用。