为什么C++异步按顺序运行而没有未来
Why C++ async run sequentially without future?
#include <future>
#include <iostream>
void main()
{
std::async(std::launch::async,[] {std::cout << "async..." << std::endl; while (1);});
std::cout << "runing main..." << std::endl;
}
在此代码中,只有"异步..."将被输出,这意味着代码在异步时被阻止。但是,如果我添加 future 并让语句变为:
std::future<bool> fut = std::async([]
{std::cout << "async..." << std::endl; while (1); return false; });
然后一切都运行顺利(不会被阻止)。我不确定为什么会以这种方式发生。我认为异步应该在单独的线程中运行。
从 encppreference.com
:
如果从
std::async
获取的std::future
没有从引用中移出或绑定到引用,则std::future
的析构函数将在完整表达式的末尾阻塞,直到异步操作完成,实质上是使以下代码同步:std::async(std::launch::async, []{ f(); }); // temporary's dtor waits for f() std::async(std::launch::async, []{ g(); }); // does not start until f() completes
如果我做对了,它来自标准的以下部分(N4527):
§30.6.6 [futures.unique_future]:
~future();
影响:
— 释放任何共享状态 (30.6.4);
§30.6.4#5 [futures.state] (重点是我的):
当异步返回对象或异步提供程序被称为释放其共享状态时,这意味着:
[...].
— 这些操作不会阻止共享状态变为就绪状态,但如果满足以下所有条件,则可能会阻止:共享状态是通过调用 std::async 创建的,共享状态尚未就绪,这是对共享状态的最后一次引用。
由于您没有存储第一次std::async
调用的结果,因此将调用 std::future
的析构函数,并且由于满足所有 3 个条件:
std::future
是通过std::async
创建的;- 共享状态尚未准备就绪(由于您的无限循环);
- 没有关于这个未来的参考
。然后呼叫正在阻塞。
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 在Linux中哪里可以找到互斥、未来等的源代码
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在C应用程序中运行C++(带有STL)函数
- 为什么C++异步按顺序运行而没有未来
- 在运行时使用未来的c++分割错误