[英]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 的指針。
在文檔的前面提到rand
和rand_r
不是線程安全的。
因此,每個線程必須分離狀態,或者必須使用互斥鎖保護調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.