在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
等待异步调用的结果。但我正在寻找一个单线程解决方案。
我认为 coroutines 可以某种方式使用。由于当前标准为C++14
,是否有boost coroutines
的解决方案?或者使用任何其他[便携式]机制?
BTW:我正在使用boost::asio
进行异步I / O.
感谢。
答案 0 :(得分:1)
如果你已经使用了boost.asio,你应该考虑它的spawn()和yield_context - http://www.boost.org/doc/libs/1_63_0/doc/html/boost_asio/reference.html#boost_asio.reference.spawn
另外你可以考虑使用boost.fiber:
" Boost.Fiber的主要优点之一是能够使用异步操作来提高效率,同时构建调用代码,就好像操作是同步的一样。"