将带有std :: ref的向量传递给线程似乎并没有更新实际的向量,而是线程仅更新了本地向量副本

问题描述

将向量std :: ref传递到线程池时,我面临一个奇怪的问题。

我不能输入确切的代码,但是我有类似的东西: 方法A

void myfunc(int start,int end,std::vector<double>& result)
{
   for(int i=start; i<end; ++i)
    {
        result[i] = ...
    }
}


vector<double> myvec(N);
const size_t num_threads = std::thread::hardware_concurrency();
vector<std::thread> threads;
threads.reserve(num_threads);

for(int idx=0; idx<num_threads; ++idx)
   threads.push_back(std::thread(myfunc,(idx*nloop/num_threads),(idx+1)*nloop/num_threads),std::ref(myvec)));

for(std::thread& t : threads)
  { 
    if(t.joinable())
     t.join();
  }

some_read_opration(myvec)...

但是,如果我显式创建线程并按硬编码范围划分任务,则可以得到期望的值。

这有效: 方法B

std::thread t1(myfunc,nloop/2,std::ref(myvec));
std::thread t2(myfunc,nloop,std::ref(myvec));

t1.join();
t2.join();

some_read_opration(myvec)...

我想以更通用的方式并行化我的循环,不确定在这里我哪里出错了。 在A方法中:我面临的问题是,似乎每个线程都在本地更新result[]元素,但是即使我传递了{ {1}}。 任何帮助都会很棒。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)