我试图找出以下原因:
threaded thr[8] = { threaded(), threaded() ,threaded() ,threaded() ,threaded() ,threaded() ,threaded() ,threaded() };
std::vector<std::thread> vec;
for (int i = 0; i < threads; i++)
{
vec.push_back(std::thread(&threaded::calc, &thr[i], i, num_samples));
}
以下没有:
std::vector<threaded> thr;
std::vector<std::thread> vec;
for (int i = 0; i < threads; i++)
{
thr.push_back(threaded());
vec.push_back(std::thread(&threaded::calc, &thr[i], i, num_samples));
}
我尝试使用std :: ref代替&amp; - 它仍然无法运作。这是线程的定义:
struct threaded
{
float elapsed1 = 0;
float elapsed2 = 0;
float res = 0;
float res_jit = 0;
void calc(int thread, int num_samples){//do something}
};
由于没有工作我的意思是,当使用vector和&amp;时,我得到内存访问冲突,当我尝试使用std :: ref(thr [i])而不是&amp;时,它没有& #39; t想要编译时出现以下错误:
Error C2672 'std::invoke': no matching overloaded function found
和
Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
如果我只使用thr [i]它工作正常,但我想修改线程类的值,所以我真的不想传递副本。
答案 0 :(得分:2)
随着向量thr
随着每个push_back
调用而变大,最终超过保留内存区域的容量,它需要重新分配其存储并将其元素复制(或移动)到新分配的空间。一旦发生,对象就开始在新的内存地址下生存,因此先前获得的地址无效。为了防止重定位,在进入循环之前保留足够的空间:
std::vector<threaded> thr;
thr.reserve(threads);
或默认 - 一次构造所有元素:
std::vector<threaded> thr(threads);