标准C ++ 11是否保证std :: async(std :: launch :: async,func)在单独的线程中启动func?

时间:2017-02-02 14:31:53

标签: c++ multithreading c++11 asynchronous c++14

标准C ++ 11是否保证std::async(std::launch::async, func)在单独的线程中启动函数?

工作草案,编程语言C ++标准2016-07-12:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

1。一方面,C ++ 11-Standard表示如果无法创建线程,则会出现错误。这可以确保创建新线程(没有错误)。

  

§30.6.8

     

6

     

抛出:system_error if policy == launch :: async和   实施无法启动新主题。

     

7错误条件:

     

(7.1) - resource_unavailable_try_again - 如果策略== launch :: async   并且系统无法启动新主题

文档说:http://en.cppreference.com/w/cpp/thread/launch

  

std :: launch :: async启动一个新线程来执行任务   异步

2。另一方面,表示该线程可以可能创建。那些线程不一定要创建。

  

§30.6.8

     

1函数模板async提供了一种启动机制   函数可能在新线程中并提供结果   在与共享共享状态的未来对象中运行。

这里写的好像在一个新线程中,它是否意味着在新的单独线程中没有必要?

  

§30.6.8

     

(3.1)

     

- 如果政策& launch :: async非零 - 调用INVOKE(DECAY_COPY   (std :: forward(f)),DECAY_COPY(std :: forward(args))...)   (20.14.2,30.3.1.2)好像在执行新线程   由调用DECAY_COPY()的线程对象表示   在调用async的线程中进行评估。存储任何返回值   作为共享状态的结果。从中传播的任何异常   执行INVOKE(DECAY_COPY(std :: forward(f)),DECAY_COPY   (std :: forward(args))...)存储为异常结果   共享状态。线程对象存储在共享状态和   影响引用的任何异步返回对象的行为   那个州。

当使用std::async(std::launch::async, func)时,标准C ++ 11是否保证func()将在单独的线程中执行,或者它可以在调用async的同一线程中执行?

1 个答案:

答案 0 :(得分:5)

这里的两个关键陈述是:

  

好像在由thread对象

表示的新执行线程中      

thread对象存储在共享状态中,并影响引用该状态的任何异步返回对象的行为。

“好像”意味着它必须完全像为此函数创建std::thread对象一样。这意味着创建std::thread的所有副作用也必须发生。

话虽如此,如果将launch::asynclaunch::deferred结合使用,则实现会决定是启动新线程还是将其推迟到现有线程。所以它只需launch::async就需要一个新线程。