标准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?
标准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::async
和launch::deferred
组合在一起,那么实现将决定是启动新线程还是将其推迟到现有线程。因此,只有launch::async
本身需要一个新线程。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 如何在C++中从两个单独的for循环中添加两个数组
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 为什么 char 可以在 std::array 中初始化为 nullptr,而不是单独初始化?
- 为什么我在单独的命名空间中转发到 std::make_pair 模棱两可
- 在C++中,如何在没有新元素且不单独声明单个元素的情况下创建"std::initializer_list<base *>"?
- 标准C++11是否保证std::async(std::launch::asyncfunc)在单独的线程中启动func
- 将 std::cout 从单独线程中的 DLL 重定向到 QTextEdit
- C 11 std ::线程以单独的方法加入主线程
- C++ std::future在单独的内核上运行每个函数
- 单独移动数组(raw array, std::array, std::vector)的每个元素
- 对std::队列的pop和push操作使用单独的互斥锁,而不是一个互斥锁
- (C++)在单独的文件中创建 std::expection 类时,输入错误末尾的预期"{"
- std::在单独的线程中插入时读取地图
- 如何使用单独类的属性对向量进行std::排序