2012-01-27 8 views
1

boost docは、io_serviceがスレッド間で任意の方法で作業を分散する可能性があると言います。つまり、TCPソケットを使用しているときにデータが混乱する可能性がありますか?私の受信ハンドラはスレッド間で任意の方法で配布される可能性があるためです。についてboost :: asio :: io_service :: run into multithread

+0

あなたのユースケースに関する詳細を教えてください。一般的には、単一のソケットへのアクセスを保護するために、ストランドを使用しています。アプリケーションは複数の異なる接続を同時に通信しますが、単一のソケットの要求は順次処理されます。 – mark

答えて

2

ブーストio_serviceを使用してasync_readまたはreadをスケジュールすると、ソケットで動作します。 socket->read(...)またはread(socket ...)のいずれかを使用します。ドキュメントを調べると、読み込み、バイト数、または一致条件の終了基準を受け入れるバリエーションがいくつかあります。これを使用すると、20バイトのデータが10バイトで1つのスレッドに読み込まれ、そのスレッドがデータを処理している間に次の20バイトが別のスレッドに渡る接続ができます。いくつかのケースがありますが、通常は各スレッドがパケット全体を読み取る必要があります。

一度に1つのスレッドだけがソケットからioを処理するようにしたい場合は、コールバックをstrandにラップすることができます。これは、そのように見えるもののかなり一般的な例です。

boost::asio::async_read(socket, 
         buffer(*responseBuffer), 
         transfer_all(), 
         strand.wrap(boost::bind(&YourClass::handleRead, 
               this, /*or use shared_from_this*/ 
               placeholders::error))); 
関連する問題