标准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的同一线程中执行?
答案 0 :(得分:5)
这里的两个关键陈述是:
好像在由
表示的新执行线程中thread
对象
thread
对象存储在共享状态中,并影响引用该状态的任何异步返回对象的行为。
“好像”意味着它必须完全像为此函数创建std::thread
对象一样。这意味着创建std::thread
的所有副作用也必须发生。
话虽如此,如果将launch::async
与launch::deferred
结合使用,则实现会决定是启动新线程还是将其推迟到现有线程。所以它只需launch::async
就需要一个新线程。