我不小心没有使用std::ref——结果代码做了什么?

I accidentally didn't use std::ref - what does the code do as a result?

本文关键字:代码 结果 什么 不小心 ref std      更新时间:2023-10-16

我正在处理我的代码突然分配了大量内存,并试图找到问题的根源。所讨论的代码非常简单,但我注意到,在使用此函数创建的线程中:

void ParallelExpandBucket(openData d, const std::unordered_set<uint64_t> &states, int myThread, int totalThreads)

我正在创建没有std::ref的线程:

threads.push_back(new std::thread(ParallelExpandBucket, d, states, x, numThreads));

结果这里实际发生了什么?

我的猜测是,我的数据被复制到线程构造函数,然后从那里一个引用被传递给ParallelExpandBucket。所以,这就解释了内存膨胀的原因。

这是正确的,还是发生了其他事情?

你是正确的。对ExpandBucket的调用获得对states副本的引用,该副本与std::thread实例存在的时间一样长。参数是按值获取的,所以这意味着要复制。

在许多情况下,你曾经需要std::ref之前的c++11,你不再需要,感谢完美的转发。例如,在调用std::make_shared。然而,在这种情况下(就像在std::bind中一样),自动使用引用将是一个巨大的问题,因为如果states不能保证与线程一样长时间存在,那么它将会爆炸,并且如果线程有引用的东西不再存在,线程将会不高兴。