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);
}
}
이 libdispatch를 사용 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);
});
}
를 사용하여, 같은 것입니다. 그들은 하지 스레드로부터 안전하고있는 documentation
기본적으로 스레드로부터 안전하지 않다고 생각했습니다. 분산 객체'std :: uniform_real_distribution zeroToOne (0.0, 1.0)'을 공유하고 스레드 당 하나의 엔진을 사용합니까? –
user1139069
@ user1139069 : 아니오, 안전하지 않습니다. 언뜻보기에 배포 객체 *는 내부 상태를 유지하지 않고 각 호출을 엔진 객체에 위임하기 만하면 작업을 수행 할 수 있지만 충분히 불규칙한 비트를 생성하지 않는 엔진을 두 번 호출해야 할 수도 있습니다. 하지만 두 번 (또는 한 번) 과잉 공격이 될 수 있으므로 과도한 임의 비트의 캐싱을 허용하는 것이 좋습니다. §26.5.1.6 \t "난수 분포 요구 사항"은 이것을 허용한다; 배포 객체에는 특히 각 호출마다 변경되는 상태가 있습니다. 따라서 잠금 목적으로 엔진의 일부로 취급해야합니다. – Potatoswatter