处理(否则)包含 C++11 随机类随机生成器调用的常量函数的正确方法是什么?您应该放弃函数的常量标志还是将生成器和分布声明为类的可变元素会更好? 一个最小的例子(不编译)可能是:
#include <random>
class foo
{
std::mt19937 MyGenerator;
std::normal_distribution<precision_type> gauss;
double get_rnd() const {return gauss(MyGenerator);}
};
最佳答案
这实际上取决于您为 const
成员访问提供的语义。
对于标准类,从多个线程同时调用const
成员是线程安全的。保留改变 RNG 的成员 const
会破坏它,除非 RNG 是完全线程安全的(对于非 const
使用)。
您不必以相同的方式设计您的类,但其他开发人员可能会发现无法同时安全地“读取”(调用 const
成员函数)的类会感到困惑.
一个选项是提供两种变体——使用内部存储的 RNG 的非常量版本,以及通过非常量引用接受 RNG 的 const
版本。 (第一个可以调用第二个,不需要const_cast
)。这实现了“只为你需要的东西付费”的线程安全指南,因为如果每个线程都提供一个线程本地 RNG 实例,多个线程可以安全地使用该对象。它还允许使用模拟 RNG 实现进行测试,这可能更有值(value)。
关于c++ - 恒定的正确性和 <random>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26059611/