std :: launch :: async策略的std :: async的行为

我有一些关于std::launch::async policy& std::future对象从异步返回的std::async函数的行为的问题。

在下面的代码中,主线程等待由async调用创建的线程完成foo()

#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的异步状态关联的最后未来对象的析构函数应阻塞,直到未来准备就绪。

我的问题是:

  • Q1。 这种行为是否符合当前的C ++标准?
  • Q2。 如果Q1的答案是肯定的,哪些陈述说?

  • 是的,这是C ++标准所要求的。 30.6.8 [futures.async]第5段,最终项目符号:

    - 相关联的线程完成与(1.10)成功检测到共享状态的就绪状态的第一个函数的返回或与释放共享状态的最后一个函数(以先发生者为准)的返回同步。

    唯一std:future的析构函数满足该条件,因此必须等待线程的完成。

    链接地址: http://www.djcxy.com/p/5199.html

    上一篇: the behavior of std::async with std::launch::async policy

    下一篇: Optimizing away a "while(1);" in C++0x