问题描述
将向量std :: ref传递到线程池时,我面临一个奇怪的问题。
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 (将#修改为@)