【问题标题】:why do boost futures return different values?为什么 boost 期货返回不同的值?
【发布时间】:2019-01-15 09:18:15
【问题描述】:

我想编写一个代码,使用 boost futures 和线程来并行计算多个函数:

函数名为“function”,接受“inputs”,我想将函数返回值存储在名为“results”的向量中

CODE 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 函数来等待线程完成..

CODE 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 没有,我不知道为什么?...我在这里错过了什么......?

【问题讨论】:

  • 请发布一个完整的、可验证的示例并说明您对输出的期望

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 2013-05-09
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多