2011-12-07 16 views
0

元々、ソケットのasync_receive()ハンドラ内でboost :: asio :: write()を実行することができますか?これは単一のスレッドで単一のio_serviceで発生しています。私はこれを行うために書かれたいくつかのコードを持っています。私はがwrite()コールにハングしていると思いました。しかし、私は自分のゲームでプレイボタンを押すのを忘れました(これは少しのクライアント - サーバーゲーム用です)!しかし、これは私のブーストアシオの理解にはあまり合わないので、質問を残しておきますが、なぜこれが機能するのですか?C++ boost asio sync async_receiveハンドラでの書き込み

まず、io_serviceがすでにこのasynch_receive()ジョブでビジー状態であるため、スレッドがwrite()呼び出しを処理できないため、これを実行できないと考えました。私はwrite()を処理できるio_service.run()を実行している別のスレッドが必要であると思っていました。どうやら、それはそうではありません。

スレッドはio_serviceで1つずつジョブを実行します。その場合、私のアプリが動作しているなら、非同期ハンドラの実行を開始したら、あなたのジョブは既にキューから移動されているはずです。右?

答えて

0

OS特有のAPIを使用してBoostによって呼び出される基本的な入出力操作(ソケット、シリアル通信など)について考えます。データが受信される同じスレッドからsendまたはWriteFile APIを呼び出すことができないものはありません。私が考えることができる唯一の副作用は、送信操作が長時間ハングして受信スレッドをブロックした場合です。しかし、これは、通信チャネル全体が機能しなくなった場合にのみ発生する可能性があります。

関連する問題