0

(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に使用しています。

ありがとうございました。

+0

あなたは[libuv](https://github.com/libuv/libuv)または[libevent](http://libevent.org/)のようなライブラリを使用することを検討していますか? – j2ko

+0

@ j2ko私はすでにI/O非同期イベントのためにboost :: asioを使用しています。私が探しているのは、非同期プログラミングをよりシーケンシャルにするためのC++メカニズムです(スレッドなし)。 –

答えて

1

あなたはすでにあなたが(その卵を検討すべきであるboost.asio使用した場合)とyield_context - http://www.boost.org/doc/libs/1_63_0/doc/html/boost_asio/reference.html#boost_asio.reference.spawn

Addtionallyあなたはboost.fiber検討することもでき:

「Boost.Fiberの主な利点の一つです効率のために非同期オペレーションを使用する能力と同時に、オペレーションが同期的であるかのようにコーリングコードを構成することができます。

関連する問題