【发布时间】:2020-01-31 03:05:00
【问题描述】:
我已经阅读了一些与我提出的问题类似的问题,但答案对我来说似乎并不完整或完全清楚。
我正在尝试并行化需要重复生成一组随机数的参数扫描。我目前只有一个线程做这样的事情:
int main() {
//Get random number generators
typedef std::mt19937 MyRNG;
std::random_device rd;
//seed generator
MyRNG rng;
rng.seed(rd());
//make my uniform distributions for each parameter
std::uniform_real_distribution<> param1(-1,1);
std::uniform_real_distribution<> param2(-1,1);
double x,y;
//Do my scan
for (int i = 0; i < N; i++) {
x = param1(rng)
y = param2(rng)
//Do things with x and y*
}
这样我每次扫描都会得到一个新的 x 和 y。现在我想利用多个内核并行执行此操作。所以我转而定义了一个函数void scan(),它的内容基本上与我的主函数相同。然后我创建多个线程并让它们运行scan()。但我不确定这是否是使用 std::thread 的线程安全的。我目前在每个线程中生成的随机数会是独立的吗?我可以通过在 void 函数之外创建 RNG 来节省自己的时间吗?谢谢。
【问题讨论】:
-
由于您尚未展示您的
scan()功能,我们无法对其发表评论。但只要每个线程都拥有它自己的专属MyRNG和分布,那么就没有理由担心它们会在线程之间共享。 -
Scan()将与 main() 相同。
标签: c++ multithreading random thread-safety