为什么助推期货返回不同的价值?

时间:2019-01-15 09:18:16

标签: c++ multithreading boost parallel-processing concurrent.futures

我想编写一个代码,在其中使用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没有,而且我不知道为什么?...我在这里想念什么...?

1 个答案:

答案 0 :(得分:0)

您没有显示function的正文,因此我们不确定。但是有一个明显的猜测。

您的第一个代码按顺序执行所有操作。启动线程,然后立即等待它们结束也有大量开销。否则与

相同
for (int i = 0; i < max_iter; i++) {
    results[i] = function(input);
}

第二个代码(可能)是并行执行的。听起来您在所有对function的调用之间共享了数据,并且在一个线程中进行更改会使在另一个线程中看到的数据无效。