`std::mt19937`静态函数变量是线程安全的吗?

问题描述 投票:0回答:1

我有一个函数

rand_double()
,它使用类型为std::mt19937
静态函数变量
生成随机浮点值。多个线程可以同时使用此函数。

#include <random>

auto random_double(double min, double max) {
    static std::mt19937 generator;
    return std::uniform_real_distribution<>{min, max}(generator);
}

我的第一个问题是,上面的代码是线程安全的吗?我知道从 C++11 开始,静态函数变量的初始化始终是线程安全的,但是并发使用生成器怎么样?

c++ random thread-safety c++20 mt19937
1个回答
0
投票

不是线程安全的,因为并发使用生成器可能会导致数据争用。虽然 C++11 保证静态函数变量的初始化是线程安全的,但它并不能保证这些变量的后续使用的线程安全。

在您的代码中,生成器在多个线程之间共享,没有任何同步机制。因此,如果多个线程同时调用 random_double,它们可能会同时访问和修改共享生成器,这可能会导致未定义的行为或不准确的随机数。

为了使其线程安全,您需要 std::mutex(在本例中为generator_mutex)并在访问生成器之前锁定它,确保一次只有一个线程可以使用生成器,从而使该函数对于并发线程安全来电。

© www.soinside.com 2019 - 2024. All rights reserved.