我正在尝试利用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
.
.
.
答案 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
调用确实按顺序运行,并且恰好被分配给同一工作线程。