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.

32
задан ildjarn 11 January 2012 в 16:28
поделиться