在 C++14 中,我想构建一种机制,以“顺序”方式使用异步 API,使用单个线程。
更明确地说,我想实现这样的目标:
// Transform AsyncOp1 into SyncOp1
// SyncOp1 returns after AsyncOp1 completes
// but yields execution to another script
void SyncOp1()
{
AsyncOp1( [](){ // async op completion handler
// TODO: yield control
} );
// TODO: control returns here after AsyncOp1 completed
}
... // similar code for SyncOp2, SyncOp3, SyncOp4,...
void Script1()
{
SyncOp1();
SyncOp2(); // SyncOp2 starts only after AsyncOp1 has completed
...
}
void Script2()
{
SyncOp3();
SyncOp4(); // SyncOp4 starts only after AsyncOp3 has completed
...
}
int main()
{
...
Spawn( Script1 );
Spawn( Script2 ); // Script1 and Script2 runs in parallel
...
// TODO some machinery here :-)
...
return 0;
}
我的程序应该同时运行多个脚本,每个脚本应该是一系列标准函数调用(SyncOpX
)。这些脚本可以并行运行,因为SyncOpX
是根据异步函数(即,在 I/O 完成时启动 I/O 操作、返回和调用回调的函数)实现的。
当然,使用多个线程很容易找到解决方案(Spawn
创建一个新线程并SynchOpX
等待异步调用的结果)。但我正在寻找一个单线程解决方案,而不是。
我认为协程可以以某种方式使用。既然目前的标准是C++14
,有没有解决办法boost coroutines
呢?还是使用任何其他 [便携式] 机制?
顺便说一句:我正在使用boost::asio
异步 I/O。
谢谢。