2011-07-29 18 views
8

ソケットを使ってasync_ *演算を実行する方法は?私はTimer.5(Boost/Asioの例)を見てきましたが、ユーザーのハンドラを呼び出す方法しか示していません。マルチスレッドアプリケーションのソケットにあるasync_writeが破損している可能性があります。また、strandは、これらのハンドラのどれも同時に実行されないことを保証します。 Boost.Asioドキュメントからboost :: asio socket async_ * strand

+1

具体的に何が問題になっていますか?非同期操作を実行することは、 'ストランド'を使用する場合と 'ストランド'を使用しない場合とで大きく異なることはありません。あなたのハンドラをストランドに包んでください。 – Chad

+0

この質問は現在のフレーズでは意味がありません。編集して明快さを加えてください。 –

+0

それは私にとって完璧な意味を持っています。私は同じ問題を抱えています。複数のスレッドが1つの接続を使用しようとしていますが、読み取り/書き込み要求の応答はすべて乱れています。私が達成しようとしているのは、非対称読み取り要求/処理(別の要求/別のサービスへの応答さえ)が必要な処理を行い、元の要求者に応答を返すことです。 – Roskoto

答えて

4

io_service ::鎖クラスは、これらのハンドラのどれが同時に を実行しないことを保証して ハンドラを投稿して派遣する機能を提供します。

Boost.Asio例でstrand利用a good exampleがあります。

strandは、ハンドラの実行が同期されることを保証します。つまり、io_serviceが複数のスレッドから実行されている場合はstrandが便利です。タスク(ハンドラ)のスケジュール方法とは関係ありません。

strandは、内部読み取り/書き込みの実行を同時に行うことができないため、複数のソケット読み取りまたは書き込み操作を同時に行うことはできません。

readsの場合は、受信シーケンスを開始し、受信データを消費した後で再度読み取りハンドラから呼び出すようにするだけでasync_readを呼び出します。シングルスレッド環境で行うことと同じです。

writes同時プロデューサがある場合(複数のスレッドがソケットに書き込むデータを提供する場合)、同時キューが必要です(boost circular buffer、「バインドされたバッファの例」を参照)。あなたの書き込み関数はこのバッファからデータを受け取り、asyncはそれをソケットに書き込みます。書き込みハンドラが書き込み関数を呼び出します。 Iマルチスレッドのアプリケーションデータでソケットにasync_write()が 壊れて記述することができる

3

。 Strandは、これらのハンドラのどれもが同時に実行されないことを保証します。

複数のスレッドがソケットにデータを書き込む必要がある場合は、データの順序を確認する必要があります。これは、async_write()documentationで明白です。

プログラムストリームは、この操作が完了 まで(例えばasync_write、ストリームのasync_write_some 機能、または書き込みを行う任意の他の合成操作のような)他の書き込み 動作を実行しないことを保証しなければなりません。

私はthis questionと私のanswerに非常によく似ているメッセージの発信キューを維持示唆しています。

関連する問題