根据这个最新的C ++ TS: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf,基于对C#async / await语言支持的理解,我想知道C ++协同程序的“执行上下文”(借用C#的术语)是什么?
我在Visual C ++ 2017 RC中的简单测试代码表明,协同程序似乎总是在线程池线程上执行,并且对应用程序开发人员几乎没有控制权,可以在其上执行协同程序的线程上下文 - 例如应用程序是否可以强制所有协程(使用编译器生成的状态机代码)仅在主线程上执行, 无 涉及任何线程池线程?
在C#中,SynchronizationContext是一种指定“上下文”的方法,其中将发布和执行所有协程“一半”(编译器生成的状态机代码),如本文所示: https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await-synchronizationcontext-and-console-apps/虽然Visual C ++ 2017 RC中的当前协程实现似乎总是依赖于并发运行时,它默认在线程池线程上执行生成的状态机代码。是否有类似的同步上下文概念,用户应用程序可以使用它来将协同程序执行绑定到特定的线程?
另外,在Visual C ++ 2017 RC中实现的协同程序的当前默认“调度程序”行为是什么?即1)如何准确指定等待条件? 2)当满足等待条件时,谁调用暂停的协程的“下半部分”?
关于C#中任务调度的我(天真)推测是C#“完全”通过任务继续“实现”等待条件 - 等待条件由TaskCompletionSource拥有的任务合成,并且任何需要等待的代码逻辑将被链接为继续它,所以如果满足等待条件,例如如果从低级网络处理程序接收到完整消息,它会执行TaskCompletionSource.SetValue,它将基础任务转换为已完成状态,从而有效地允许链式延续逻辑开始执行(将任务置于就绪状态/列表中在C ++协程中,我推测std :: future和std :: promise将被用作类似的机制(std :: future是任务,而std :: promise是TaskCompletionSource,用法也是惊人的相似!) - C ++协同调度程序(如果有的话)也依赖于某种类似的机制来执行这种行为吗?
[编辑]:在做了一些进一步的研究之后,我能够编写一个非常简单但非常强大的抽象代码,称为awaitable,支持单线程和协作式多任务处理,并具有一个简单的基于thread_local的调度程序,它可以在线程上执行协同程序 根协程开始了。代码可以在这个github repo中找到: https://github.com/llint/Awaitable
Awaitable是一种可组合的方式,它在嵌套级别维护正确的调用排序,并且它具有原始的让步,定时等待和从其他地方设置就绪,并且可以从中导出非常复杂的使用模式(例如只有无限循环协程当某些事件发生时被唤醒),编程模型紧跟C#Task async / await模式。请随时提供反馈。