C++|VS2019中C++20的协程实现
【C++|VS2019中C++20的协程实现】

以下内容来自Terry Mahaffey和Ramkumar Ramesh 。
在Visual Studio 2019 v16.8中 , 我们在一篇文章中宣布了对协程的支持 。 从那个时候开始 , 我们引入了一些列和协程相关的新特性和改进 。 今天的这篇文章 , 我们将这些新东西来一个汇总给大家看看 , 所有这些新东西都已经在Visual Studio 2019 v16.11版本中可用 。
调试改进从VS2019 v16.9版开始 , 单步进入(Step into)调试到一个协程的时候 , 执行流会直接进入到协程代码体中(有个一个特殊情况 , 即这个协程一开始就被设置成了暂停执行状态 , 在这种特殊情况下 , 执行流会直接跳过”Step over”) 。 跳过一个co_await将进入co_await后面的逻辑语句中 , 用于协程 , 这可能在一个完全不同的执行上下文中(甚至另一个线程)!
这允许单步执行协程 , 实现无缝匹配应用程序的逻辑流并跳过中间的实现细节 。 为获得最佳调试体验 , 应将协程状态的实现细节标记为非用户代码 。 单步执行协程现在还会在本地变量”Locals”窗口中按预期显示函数参数 , 以便你可以查看应用程序的状态 , 类似于单步执行同步函数 。
我们通过对标准协程的调试可视化工具的一些改进 , 现在可以更轻松地查看已暂停执行协程的状态 。之前旧版本的coroutine_handle可视化器可以显示初始和最终暂停点的特殊指标 , 但仅显示其他暂停点的数字 。 这个数字并不总是很容易映射回原始协程中的特定点 。 可视化器还显示了协程的名称 , 但只是作为由实现生成的修改后的内部名称 , 没有对应的签名信息 。 如下图所示:
我们可以看到 , 在上图中 , 协程的名称被显示为:”sample_coroutine$_ResumeCoro$1(void)” 。
使用Visual Studio 2019 v16.10中引入的新协程句柄可视化器 , 函数名称可以被正确地显示了 。 并且包含了完整的签名信息以帮助区分重载的协程 。 除了初始和最终挂起之外的挂起点信息 , 可视化器中还包括了源代码行号 , 以便于查找 , 如下图所示:
在上图中 , 我们可以看到 , 现在的协程被显示为”sample_coroutine(int)” , 并标识其当前状态为已挂起状态 , 位于源代码的第35行 。
编译器开关:/await:strict在之前的一篇文章中 , 我们提到Legacy模式的await存在一些问题 , 以及在/std:c++latest中保持 /await开关与C++20协程支持不同的基本原理 。 Legacy模式对于早期采用C++协程但不是标准协程的用户很有用 。
/await这个编译器开关不仅早于我们的/std:c++latest和/std:c++20这两个开关 , 还早于 /std:c++17 。 早在协程成为C++标准的一部分之前 , 一些开发者就开始使用协程了 。 这些开发者可以使用协程 , 而不要求他们的代码符合C++20甚至是C++17标准 。 由于标准协程仅在C++20和最新模式下可用 , 协程的早期采用者无法将其代码移动到更新的语言版本 , 因此被困在等待协程的遗留实现中 。 他们无法利用一些新功能 , 例如对称传输和改进的调试器支持 , 即使他们愿意对协程本身进行代码修改以使其符合C++20标准 。
从Visual Studio 2019 v16.10版开始 , 我们引入了一个新开关 , 以帮助早期协程采用者过渡到合规协程并使用标准协程中的所有可用功能 , 这个开关就是:/await:strict 。
使用此开关代替/await可以启用与标准模式相同的C++20协程支持 , 但没有/std:c++20的所有其他要求 。 这包括对所有标准C++20协程功能和调试器集成的支持 , 并禁用/await下仍然支持的所有遗留扩展/std:c++20协程和/await:strict之间的唯一区别是:后者没有为std::coroutine_handle 定义飞船操作符(spaceship operator) 。 不同的是 , 它定义了单独的关系运算符 。
- 滴滴出行|裁员真能拯救中国互联网?
- 北斗|中国航天进入发展快车道
- 领军企业|30个!中国科协发布2022年科技领域重大问题难题
- 有人觉得中暑就是热出来的,吃一些退烧药就好了,这种做法 蚂蚁庄园今日答案6月28日
- 在昨日推文中,王者荣耀将以“____文化”为主题推出限定皮肤,为乡村振兴加油? 王者荣耀6月28日每日一题答案
- 零售业|确定涨价!iPhone14四款新机全面涨价!国行也在其中!
- 华为|意识到离不开中国了?外媒称华为、中兴或将重新打入美国市场
- 恒大|中国恒大回应被清盘呈请:极力反对 预期不影响重组计划
- 月球也在太阳系的宜居带中,为何不能产生生命?原来个头太小了
- 太空中的真菌毒素是否危害宇航员健康?科学家:尚不明确
