在VisualStudio 2015的预览中,我们介绍了C++的Coroutines,请参见 博客文章 介绍一下 在这里 . 你也可以看看CPPCon 2015,讨论C++的协同程序 在这里 .
我们继续研究可恢复函数,这里是VS 2015 update 1中协同程序状态的简要更新。请参阅Visual Studio 2015 update 1文章 在这里 .
一些限制消失了:
- 现在支持ARM、x86和amd64
- 现在您可以在协同程序中使用异常
- 现在您可以在一个协同程序中使用return语句,然后再等待或屈服
- 现在您可以将协同程序与/ZI一起使用(编辑并继续调试)
一些人留下来:
- 仍然与/sdl和/RTCx标志不兼容(应在VS Update 2中修复)
- 对于协程中未使用或未初始化的变量,我们将给出错误的/W4警告
跟踪最新协同方案的设计变更(P0057):
- 初始u suspend/最终u suspend/屈服u值必须返回awaitable
- 分配定制是通过重载promise的新操作符而不是提供分配器对象来完成的
- 通过操作员等待进行等待定制
- 收益现在是一种表达,而不是一种陈述
- (详见P0054)
VS Update 2中的预期内容
- 消除限制
- 添加特定于协同程序的优化
- 等待转换自定义点(见P0054)
- 添加Kona 2015关键词:cou Wait、cou yield和cou return。
工具书类
- P0054: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0054r0.html P0057: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0057r0.pdf CppCon合作对话: https://www.youtube.com/watch?v=_fu0gx-xseY
奖金
使用operator await定义如何在直接进入Win32线程池API的std::chrono::duration上等待。
#包括
#包括 <未来>
#包括
汽车 操作人员 等待(std::chrono:: 系统瞬变电磁钟 :: 期间 期间 ) {
班 等待者 {
静止的 无效 回拨 计时器回调( PTP回调实例 , 无效 * 上下文 , PTPU定时器 ) {
标准::实验:: 协同程序句柄 <>::发件人地址( 上下文 ) () ;
}
PTPU定时器 定时器= 空PTR ;
标准::时间:: 系统时钟 :: 期间 持续时间;
公众的 :
明确的 等待者(std::chrono:: 系统时钟 :: 期间 d ):持续时间( d ) {}
布尔 等待u就绪() 常数 { 返回 duration.count()<=0;}
布尔 等待挂起(标准::实验:: 协同程序句柄 <> 简历u cb ) {
国际64 相对计数=-持续时间。计数();
计时器=CreateThreadpoolTimer(TimerCallback, 简历u cb .to地址(), 空PTR );
SetThreadpoolTimer(计时器( P文件时间 )&相对计数,0,0);
返回 计时器!=0;
}
无效 等待恢复(){}
~等待者(){ 如果 (计时器)CloseThreadpoolTimer(计时器);}
};
返回 等待者 { 期间 };
}
使用 命名空间 标准;
使用 命名空间 标准::计时;
未来 < 无效 >测试(){
库特 << 此线程::getu id() << “:正在睡觉…” ;
等待 1ms;
库特 << 此线程::getu id() << “:醒来” ;
}
内景 主(){
test().get();
库特 << 此线程::getu id() << “:返回main”” ;
}