我有一个函数
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++11 保证静态函数变量的初始化是线程安全的,但它并不能保证这些变量的后续使用的线程安全。
在您的代码中,生成器在多个线程之间共享,没有任何同步机制。因此,如果多个线程同时调用 random_double,它们可能会同时访问和修改共享生成器,这可能会导致未定义的行为或不准确的随机数。
为了使其线程安全,您需要 std::mutex(在本例中为generator_mutex)并在访问生成器之前锁定它,确保一次只有一个线程可以使用生成器,从而使该函数对于并发线程安全来电。