与std :: async启动没有并行发生,正在执行同一线程

时间:2018-08-28 13:53:41

标签: multithreading c++11 asynchronous

我正在尝试利用std :: async功能进行并行处理。但是,如果我打印线程ID,它将始终返回相同的值。就像它按顺序运行此代码一样。我想念什么吗?

代码:

int main()
{
    bool check = false;
    auto func = [&](int i) 
                          { 
                            std::cout<<"  i : "<<i<<"  thread_id : "<<std::this_thread::get_id()<<" ";
                            check = true;
                          }

    for(int j=0;j<10;j++)
    {
        std::async(std::async::launch, func, j);
    }

    std::cout<<" check : "<<check<<" ";

    return 0;
}

结果:

i : 0  thread_id : 47263726
i : 1  thread_id : 47263726
i : 2  thread_id : 47263726
i : 3  thread_id : 47263726
i : 4  thread_id : 47263726
.
.
.

2 个答案:

答案 0 :(得分:3)

根据注释here

  

如果从std :: async获得的std :: future没有从引用中移出或绑定到引用,则std :: future的析构函数将在完整表达式的结尾处阻塞,直到异步操作完成为止,从本质上讲代码[...]同步

这正是您的情况。您需要注意async的回报。

#include <vector>
#include <future>
#include <iostream>
#include <chrono>
#include <mutex>

int main()
{
    auto func = [](int i) { 
      std::cout<<"  i : "<<i<<"  thread_id : "<<std::this_thread::get_id()<<"\n";
    };

    using Handle = std::future<void>; // pretty hard to be figured out automatically 
                                      // from lambda, but your function "returns" void
    std::vector<Handle> handles;
    for(int j=0;j<10;j++)
    {
        handles.push_back(std::async(std::launch::async, func, j));
        //result of std::async is implicitly moved onto the vector
    }

    return 0;
}

输出:

  i : 6  thread_id : 47713265002240
  i : 7  thread_id : 47713267103488
  i : 8  thread_id : 47713269204736
  i : 9  thread_id : 47713271305984
  i : 5  thread_id : 47713262900992
  i : 4  thread_id : 47713260799744
  i : 3  thread_id : 47713258698496
  i : 2  thread_id : 47713256597248
  i : 1  thread_id : 47713254496000
  i : 0  thread_id : 47713252394752

答案 1 :(得分:2)

std::async返回一个临时的将来对象,然后将其立即销毁。在这种特定情况下,允许std::future destructor阻塞,等待异步操作完成。这可能是您观察到的-func调用确实按顺序运行,并且恰好被分配给同一工作线程。