我对std::async
政策与std::launch::async
政策的行为有疑问。从异步返回的std::future
对象。
在以下代码中,主线程等待foo()
调用创建的线程上async
的完成。
#include <thread>
#include <future>
#include <iostream>
void foo()
{
std::cout << "foo:begin" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "foo:done" << std::endl;
}
int main()
{
std::cout << "main:begin" << std::endl;
{
auto f = std::async(std::launch::async, foo);
// dtor f::~f blocks until completion of foo()... why??
}
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "main:done" << std::endl;
}
我知道http://www.stdthread.co.uk/doc/headers/future/async.html说
与之关联的最后一个对象的析构函数 返回的std :: future的异步状态应该阻塞,直到 未来已经准备好了。
我的问题是:
答案 0 :(得分:16)
是的,这是C ++标准所要求的。 30.6.8 [futures.async]第5段,最后一颗子弹:
- 关联的线程完成与(1.10)从成功检测到共享状态的就绪状态的第一个函数的返回或与释放共享状态的最后一个函数的返回同步(以先发生者为准)。
唯一std:future
的析构函数满足该条件,因此必须等待线程的完成。