2308C++协程流程9
参考
#include <协程>
#include "简异中.cpp"
//用来中文定义的.元<类 T>构 P;元<类 T>构 任务{用 承诺型=P<T>;任务()=默认;动 符号 协待()常 无异{构 等待器{极 直接协()常 无异{中 p.是准备好();}协柄 挂起协(协柄<>o)常 无异{p.连续=o;中 协柄<P<T>>::从承诺(P);}T&&恢复协()常{中 p.取果();}P<T>&p;};中 等待器{*p};}T&&取果(){中 p->取果();}私:任务(P<T>*a):p{a}{}P<T>*p=空针;元<类>友 构 P;
};元<类 T>构 P{动 取中(){中 任务<T>{本};}从不挂起 初挂起()无异{中{};}动 终挂起()无异{构 止等待器{极 直接协()常 无异{中 假;}空 挂起协(协柄<P<T>>h)无异{动&p=h.承诺();如(p.连续)p.连续();}空 恢复协()常 无异{}};中 止等待器{};}空 对异常(){退出(1);}元<类 U>空 中值(U&&值){果.元 原位<1>(前向<U>(值));}T&&取果(){如(果.索引()==2)再抛异常(取<2>(果));中 移动(取<1>(果));}极 是准备好(){中 果.索引()!=0;}变量<单态,T,异常针>果;协柄<>连续;
};构 异步读文件{异步读文件(路径 a):e{移动(a)}{}极 直接协()常 无异{中 假;}空 挂起协(协柄<>d){动 工作=[本,d]()可变{输出<<本线程::取标识()<<"工作者线程:打开文件";动 l=入文件流{e};//.2输出<<本线程::取标识()<<"工作者线程:读文件";果.赋值(入流缓冲步<符>{l},入流缓冲步<符>{});输出<<本线程::取标识()<<"工作者线程:恢复协程";d();//.3,这里恢复协程.输出<<本线程::取标识()<<"工作者线程:退出";//.5};线程{工作}.分离();}串 恢复协()无异{中 移动(果);}私:路径 e;串 果;
};任务<整>f(){输出<<本线程::取标识()<<"读文件():将异步读文件";//.1常 动 果=协待 异步读文件{"错误.txt"};输出<<本线程::取标识()<<"读文件():将中(大小"<<果.大小()<<")\n";//.4协中 果.大小();
}整 主(){动 任务=f();本线程::要休息(1s);输出<<"文件大小="<<任务.取果()<<'\n';//.6
}
/*
8972读文件():将异步读文件
5328工作者线程:打开文件
5328工作者线程:读文件
5328工作者线程:恢复协程
5328读文件():将中(大小751)
5328工作者线程:退出文件大小=751* /