在C++ 11中,有大量新的隨機數生成器引擎和分佈函數。他們線程安全嗎?如果您在多個線程中共享一個隨機分佈和引擎,是否安全,您仍然會收到隨機數字?我期待的場景是一樣的東西,C++ 11隨機數生成器的線程安全性
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
#pragma omp parallel for
for (int i = 0; i < 1000; i++) {
double a = zeroToOne(engine);
}
}
使用OpenMP或
void foo() {
std::mt19937_64 engine(static_cast<uint64_t> (system_clock::to_time_t(system_clock::now())));
std::uniform_real_distribution<double> zeroToOne(0.0, 1.0);
dispatch_apply(1000, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
double a = zeroToOne(engine);
});
}
使用libdispatch。
這基本上是我認爲它不是線程安全的。是否可以共享分配對象'std :: uniform_real_distribution zeroToOne(0.0,1.0)'線程數量並且每個線程使用一個引擎? –
user1139069
2012-01-13 17:24:48
@ user1139069:不,不安全。儘管乍看之下,分發對象*可以通過簡單地將每個調用委託給引擎對象來完成工作,而不需要維護內部狀態,但是如果您考慮一下,不會產生足夠多的隨機位的引擎可能需要調用兩次。但是兩次(或一次)可能會過度,所以允許緩存多餘的隨機比特可能會更好。 §26.5.1.6\t「隨機數字分配要求」允許這樣做;分配對象特別具有隨每次調用而改變的狀態。因此,他們應該被視爲鎖定目的引擎的一部分。 – Potatoswatter 2012-01-14 02:44:36