我不小心没有使用std::ref——结果代码做了什么?
I accidentally didn't use std::ref - what does the code do as a result?
我正在处理我的代码突然分配了大量内存,并试图找到问题的根源。所讨论的代码非常简单,但我注意到,在使用此函数创建的线程中:
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
不能保证与线程一样长时间存在,那么它将会爆炸,并且如果线程有引用的东西不再存在,线程将会不高兴。
相关文章:
- 这两个代码片段相似,但显示的结果不同
- 为什么第二个代码给出了预期的结果,而第一个代码却没有?
- RapidXML - 代码创建意外结果
- 代码未在联机编译器上显示结果
- 为什么这两段使用 constexpr、__PRETTY_FUNCTION__ 和 char * 的代码有不同的结果?
- C++位移位在相反方向上具有相同的常量,结果不同,代码更改很小
- 我的代码厨师提交显示错误的结果
- 如何查找导致结果不一致的代码
- 如何使用 c++ 将股票代码的结果添加到 poloniex 中的数组中?
- 我无法弄清楚我的代码未显示预期结果的问题
- 为什么这段代码(在 Matlab 的 MEX 文件中使用 OpenMP)给出不同的结果?
- 为什么这两个相似的代码计算行列式的结果不同?
- 为什么这个C++程序在代码::块和在线 IDE 之间返回不同的结果?
- C++:汇编代码包含断言结果
- 有人可以解释一下'sizeof'在此代码中返回的结果吗
- 相同的代码在联机 IDE 和本地 IDE 中给出不同的结果
- 如何在C 中为文本文件编写代码结果(在void函数之内)
- 我的代码结果为零,我不知道为什么
- 当我尝试输入时,我的代码结果为0
- 数组大小会影响代码结果