尽管不是const,所有<random>分布都是安全的吗?

时间:2017-08-27 19:27:51

标签: c++ c++11 random

请注意,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;
}

1 个答案:

答案 0 :(得分:8)

不,这些对象不是线程安全的(与任何其他标准库对象一样,除非另有说明)。您不应在线程之间共享任何这些对象,而不使用互斥锁或类似构造保护它们。