(C++で)シングルスレッドを使用して、非同期APIを「順次」使用するメカニズムを構築したいと思います。C++非同期プログラミングをよりリニアにする方法(コルーチン?)
私はこのような何かをachiveしたいのですが、より明確にするために:
// 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に使用しています。
ありがとうございました。
あなたは[libuv](https://github.com/libuv/libuv)または[libevent](http://libevent.org/)のようなライブラリを使用することを検討していますか? – j2ko
@ j2ko私はすでにI/O非同期イベントのためにboost :: asioを使用しています。私が探しているのは、非同期プログラミングをよりシーケンシャルにするためのC++メカニズムです(スレッドなし)。 –