C# 中的 C++ std::async 与异步/等待

Posted

技术标签:

【中文标题】C# 中的 C++ std::async 与异步/等待【英文标题】:C++ std::async vs async/await in C# 【发布时间】:2011-03-31 10:54:25 【问题描述】:

我想知道新的 c++ 功能 std::async 是否与两个 C# 关键字 async/await 相当,如果不是,为什么?

【问题讨论】:

【参考方案1】:

并非如此,假设我正确阅读了this std::async documentation。

C# 5 的 async/await 特性涉及异步方法的复杂编译器转换,因此您可以编写看起来非常同步但具有异步点的代码。编译器为您构建状态机,创建适当的回调等。

编辑:虽然我之前认为std::async 只是强制你显式地传入回调,但它看起来比这更原始。无论哪种方式,我相信它主要/完全是 library 功能,而 C# 5 的异步方法主要是具有库支持的 language 功能。

编辑:正如 cmets 中进一步指出的那样,looks like it's on its way for VC++...

【讨论】:

std::async 没有延续或完成回调。您所能做的就是在等待它完成时阻止。与 TPL 相比,它非常原始。 但是在 C++ 中,您可以使用协程将 C# 5 的 await 作为 library 功能实现等效。证明:CppAwait @valentin.milea:我没有足够的 C++ 或 Boost.Context 知识来了解您的代码与 await 的比较。我怀疑它不是完全等效的,这并不是说它没有用。 @ValentinMilea:正如我所说,我需要更仔细地查看细节以比较它们,但如果任何仅库版本具有该语言的所有优点,我会感到惊讶 -支持的版本。 以下概念验证表明,await 功能的精确语法可以在 Stackful Coroutines 的帮助下进行模拟:await_emu【参考方案2】:

CPPASYNC(在另一个答案中提供)看起来像您正在寻找的东西。 “异步”部分很简单,性能看起来不错(可能比 C# 实现更好)。 这是丑陋的 b/c,您需要围绕异步回调调用的特殊“等待”包装器。提供了一些 Boost 网络,它们很容易制作,但你不能只是“等待”任何东西: 异步任何方法/函数, 在异步函数中,等待: - 一个异步函数 - 围绕异步函数(需要回调)的等待包装器(制作简单)

【讨论】:

我对这个答案感到非常困惑。我不知道你想说什么。 我认为他的意思是 CppAwait 提供了与 C# 的 async/await 相当的东西,但您需要包装预先存在的 async API 以使其可等待(就像我为 Boost.Asio 的一部分所做的那样)。不是正确的地方,因为问题是关于 std::async。

以上是关于C# 中的 C++ std::async 与异步/等待的主要内容,如果未能解决你的问题,请参考以下文章

c++中的异步编程——future,promise

C++ - 使用 std::async 时显示进度条

C++并发与多线程 11_std::atomic叙谈std::launch(std::async) 深入

C++ 从 std::async 函数读取命名空间中的全局变量标志

如何在 C++ 中运行异步增强功能?

C++11 线程与异步性能(VS2013)