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

Does standard C++11 guarantee that std::async(std::launch::async, func) launches func in separate thread?

本文关键字:std 单独 线程 func 启动 launch 是否 C++11 async 标准 asyncfunc      更新时间:2023-10-16

标准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标准说,如果不能创建线程,那么就有错误。这样可以确保创建一个新线程(在没有错误的情况下)。

§30.6.8

6

如果policy==launch::async和实现无法启动新线程

7错误条件:

(7.1)--resource_unavailable_try_reon--如果policy==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的同一线程中执行?

这里的两个关键语句是:

就好像在由thread对象表示的新执行线程中

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

"As if"表示它的行为必须与为此函数创建std::thread对象完全一样。这意味着创建std::thread的所有副作用也必须发生。

也就是说,如果您将launch::asynclaunch::deferred组合在一起,那么实现将决定是启动新线程还是将其推迟到现有线程。因此,只有launch::async本身需要一个新线程。