我想编写一个代码,在其中使用boost期货和线程并行计算几个函数:
该函数名为“ function”,它承担“ inputs”,我想将函数返回值存储在名为“ results”的向量中
代码1(仅是主代码的一部分):
for (int i = 0; i < max_iter; i++) {
boost::shared_future<double>> future = boost::async(boost::launch::async,boost::bind(&function,input));
results[i] = future.get();}
但是我想让线程并行运行,所以我尝试执行此代码,将期货存储在向量中,然后在所有期货准备好后立即获取结果。我使用了boost的wait_for_all函数来等待线程完成。.
代码2(仅是主代码的一部分):
for (int i = 0; i < max_iter; i++) {
boost::shared_future<double>> future = boost::async(boost::launch::async,boost::bind(&function,input));
future_buffer.push_back(future);
boost::wait_for_all(future_buffer.begin(), future_buffer.end())
for (int l = 0; l < max; l++) {
results[l] = future_buffer[l].get()
}
我必须同时遵守CODE 1和CODE 2,但是得到的结果却不同...我检查了一下,CODE 1给出了正确的结果,但是CODE 2没有,而且我不知道为什么?...我在这里想念什么...?
答案 0 :(得分:0)
您没有显示function
的正文,因此我们不确定。但是有一个明显的猜测。
您的第一个代码按顺序执行所有操作。启动线程,然后立即等待它们结束也有大量开销。否则与
相同for (int i = 0; i < max_iter; i++) {
results[i] = function(input);
}
第二个代码(可能)是并行执行的。听起来您在所有对function
的调用之间共享了数据,并且在一个线程中进行更改会使在另一个线程中看到的数据无效。