运行 向量中使用 TBB 的函数给出了错误的输出
Running functions in a vector using TBB gives incorrect output
这是我的代码,它应该在屏幕上写入数字 0 到 19(以随机顺序)。
vector<std::function<void(void)>> tasks;
for(int i=0; i<20;i++)
{
tasks.push_back( [&](){cout<< i<<endl;} );
}
tbb::parallel_for(size_t(0), size_t(tasks.size()), [&](int K) {(tasks[K])();});
出局是:
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
我做错了什么?我怎样才能写出数字 0 到 19?
您在添加新任务时将 引用 传递给了 i
:
tasks.push_back( [&](){cout<< i<<endl;} );
// ^^^ here
当任务运行时,i
已经达到20,所以每个线程都会打印。
相反,您可能想要捕获 copy of i
:
tasks.push_back([=i]{ std::cout << i << '\n'; });
(那里的 =
是可选的;我把它包括在内是为了使观点更清楚)
这是我的代码,它应该在屏幕上写入数字 0 到 19(以随机顺序)。
vector<std::function<void(void)>> tasks;
for(int i=0; i<20;i++)
{
tasks.push_back( [&](){cout<< i<<endl;} );
}
tbb::parallel_for(size_t(0), size_t(tasks.size()), [&](int K) {(tasks[K])();});
出局是:
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
我做错了什么?我怎样才能写出数字 0 到 19?
您在添加新任务时将 引用 传递给了 i
:
tasks.push_back( [&](){cout<< i<<endl;} ); // ^^^ here
当任务运行时,i
已经达到20,所以每个线程都会打印。
相反,您可能想要捕获 copy of i
:
tasks.push_back([=i]{ std::cout << i << '\n'; });
(那里的 =
是可选的;我把它包括在内是为了使观点更清楚)