2016-06-14 5 views

答えて

3

IO-オブジェクトクラス上のasync_xxx方法のすべてのドキュメントは、このような経過を持っている:

にかかわらず、非同期操作はすぐにか完了したかどうかの、ハンドラはこの関数内から呼び出されることはありません

。ハンドラの呼び出しは、boost::asio::io_service::post()を使用するのと同等の方法での方法で実行されます。 boost::asio::io_service::post()のドキュメントを見てみると

...

この関数は、しかしio_serviceは、この関数の中からハンドラを呼び出すことができるようにすることなく、与えられたハンドラを実行するためにio_serviceを依頼するために使用されます。

io_serviceは、現在呼び出されているハンドラのみでrun()run_one()poll()又はpoll_one()メンバ関数スレッドで呼び出されることを保証します。

これは保証の完全な範囲です。

コードが非同期イベントの一時的な順序に依存している場合は、非同期コードではありません。

をrun_one()ファンクションブロック1件のハンドラが派遣されるまで、またはio_serviceが停止されるまで:

run_one()のさえドキュメントは、それが派遣したハンドラに関する一切の保証を行いません。

ます(読み込みなど)は、個々の非同期操作を配列決定しなければならない場合は、どちらかが義務付けられている:

  • 最初のハンドラから第2の動作を開始する、または

  • オペレーションのハンドラが未処理である間にフラグセットを保持し、フラグが偽のときにのみ別のオペレーションを開始する。

+0

async_writeが進行中の場合(リモートエンドはハートビート応答としてメッセージを受け付けます)、受信したプロトコルのハートビート要求(TCPベースのプロトコル)を無視します。この素敵なショートカットは、異なるepoll反復間で完了コールバックを並べ替えないASIOに関する(有効な)仮定が成立する場合にのみ機能します。つまり、論理が文書化された、または文書化されていないASIOの動作に依存している理論的な領域からの疑問です。 – bobah

+0

@bobah論理は、文書化されていないAsioの動作に依存しています。ショートカットが実際に役立つ場合は、リアクタスタイルの操作でロジックを明示的にプログラミングすることを検討する価値があります。 –

+1

@bobahわかりません...あなたのコードです。しかし、私の場合は、明示的に表現された操作の暗黙的な順序付けをすることを好みます。 –