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++并发与多线程 11_std::atomic叙谈std::launch(std::async) 深入