ソケットを使ってasync_ *演算を実行する方法は?私はTimer.5(Boost/Asioの例)を見てきましたが、ユーザーのハンドラを呼び出す方法しか示していません。マルチスレッドアプリケーションのソケットにあるasync_write
が破損している可能性があります。また、strand
は、これらのハンドラのどれも同時に実行されないことを保証します。 Boost.Asioドキュメントからboost :: asio socket async_ * strand
答えて
:
io_service ::鎖クラスは、これらのハンドラのどれが同時に を実行しないことを保証して ハンドラを投稿して派遣する機能を提供します。
Boost.Asio例でstrand
利用a good exampleがあります。
strand
は、ハンドラの実行が同期されることを保証します。つまり、io_service
が複数のスレッドから実行されている場合はstrand
が便利です。タスク(ハンドラ)のスケジュール方法とは関係ありません。
strand
は、内部読み取り/書き込みの実行を同時に行うことができないため、複数のソケット読み取りまたは書き込み操作を同時に行うことはできません。
reads
の場合は、受信シーケンスを開始し、受信データを消費した後で再度読み取りハンドラから呼び出すようにするだけでasync_read
を呼び出します。シングルスレッド環境で行うことと同じです。
writes
同時プロデューサがある場合(複数のスレッドがソケットに書き込むデータを提供する場合)、同時キューが必要です(boost circular buffer、「バインドされたバッファの例」を参照)。あなたの書き込み関数はこのバッファからデータを受け取り、asyncはそれをソケットに書き込みます。書き込みハンドラが書き込み関数を呼び出します。 Iマルチスレッドのアプリケーションデータでソケットにasync_write()
が 壊れて記述することができる
。 Strandは、これらのハンドラのどれもが同時に実行されないことを保証します。
複数のスレッドがソケットにデータを書き込む必要がある場合は、データの順序を確認する必要があります。これは、async_write()
documentationで明白です。
プログラムストリームは、この操作が完了 まで(例えばasync_write、ストリームのasync_write_some 機能、または書き込みを行う任意の他の合成操作のような)他の書き込み 動作を実行しないことを保証しなければなりません。
私はthis questionと私のanswerに非常によく似ているメッセージの発信キューを維持示唆しています。
- 1. boost asio unix socket reuse
- 2. boost :: asio :: ip :: tcp :: socket :: cancel()とsocket :: close()を使用する
- 3. boost :: asio :: ip :: tcp :: socket :: cancelとsocket :: closeの違い
- 4. boost asioサーバーがclose boost :: socketの呼び出しでハングアップする
- 5. boost :: asio serverマルチプロセス
- 6. boost :: asio :: ip :: tcp :: socketが接続されていますか?
- 7. boost asio udp socket async_receive_fromがハンドラを呼び出さない
- 8. boost :: asio :: async_resolve問題
- 9. Boost :: asioとasync_read
- 10. boost :: asio UDPブロードキャスト
- 11. Boost :: asio async_waitハンドラシグネチャ
- 12. ユニットテストとboost :: asio
- 13. boost :: asio sslリンクエラー
- 14. boost :: asio :: streambuf empty?
- 15. asio/strand:タイマーの動作が異なるのはなぜですか?
- 16. オーバーロード可能boost :: asio :: basic_stream_socket
- 17. boost :: asio :: tcp :: socketハンドラを呼び出さずに閉じるとキャンセルする
- 18. boost :: asioのasync_ *のハンドラが常に呼び出されることは保証されていますか?
- 19. Boost :: Asio :: Ip :: Tcp :: Iostream質問
- 20. boost :: threadsからboost :: asioタイマーへ
- 21. boost :: asio非同期操作とリソース
- 22. boost :: asioソケットとブロッキングについて
- 23. Boost :: Asio Chat Server-Client Failure
- 24. boost :: asio読書のトラブル
- 25. boost :: asioのasync_read()のEOF
- 26. boost :: asio signal_set - ループに入ります
- 27. クライアントがあるC++のboost/asioサーバー
- 28. asio socket-> connect callの後でGDBブレークポイントが機能しなくなる
- 29. boost :: asioソケットをC++/CLI .NETソケットに変換する方法は?
- 30. 私がboost :: asio :: io_serive :: stop()を呼び出すと、boost :: asio :: io_service :: run()が終了しない
具体的に何が問題になっていますか?非同期操作を実行することは、 'ストランド'を使用する場合と 'ストランド'を使用しない場合とで大きく異なることはありません。あなたのハンドラをストランドに包んでください。 – Chad
この質問は現在のフレーズでは意味がありません。編集して明快さを加えてください。 –
それは私にとって完璧な意味を持っています。私は同じ問題を抱えています。複数のスレッドが1つの接続を使用しようとしていますが、読み取り/書き込み要求の応答はすべて乱れています。私が達成しようとしているのは、非対称読み取り要求/処理(別の要求/別のサービスへの応答さえ)が必要な処理を行い、元の要求者に応答を返すことです。 – Roskoto