请注意,std :: normal_distribution :: operator()不是 const,也不是以const方式运行。 (其他一些发行版的()运算符以const方式运行,但也没有定义为const)。
鉴于std :: normal_distribution :: operator()不是const,在多个线程中使用相同的normal_distribution对象是否仍然安全?随机标题中的所有发行版都安全吗?
编辑:也就是说,以下成员函数因函数为const而引发错误,但使用的是operator(),可以更改d。通过声明d是可变的来解决这个问题总是安全的吗?
class MyClass
{
public:
MyClass::MyClass(double mu, double sigma)
{
d = normal_distribution<double>(mu, sigma);
}
double MyClass::foo(std::mt19937_64 & generator) const
{
return d(generator);
}
private:
std::normal_distribution<double> d;
}
答案 0 :(得分:8)
不,这些对象不是线程安全的(与任何其他标准库对象一样,除非另有说明)。您不应在线程之间共享任何这些对象,而不使用互斥锁或类似构造保护它们。