3

Boost 1.52.0の時点でboost::asio::ip::tcp::acceptorboost::asio::ip::tcp::socketの両方が非スレッドセーフとしてマークされている場合、tcp::acceptor現在ブロックしaccept()ているスレッドを別のスレッドからシャットダウンすることは可能ですか?

私は呼び出しを見てきましたが、スレッドセーフでboost::asio::io_service::stop()あるため、これは可能に見え ます。io_serviceこれio_serviceにより、ソケットで行われている処理が完了するまで、イベント ループが実行されたままになりますか?

これはより大きなプログラムの一部と同じくらい単純なイベントループであり、非同期が行うことを理解する正当な理由なしに追加のスレッドを作成したくないため、私は同期的に動作しています。

4

3 に答える 3

4

これを調査するのに時間を費やした後、これを実現できるスレッドセーフな方法は1つだけaccept()です。つまり、ソケットとアクセプターを閉じるようにスレッドに指示するメッセージをソケットに送信することです(待機していないスレッド上)。これを行うことにより、ソケットとアクセプターを単一のスレッドで完全に所有することができます。

別途指摘したように、io_serviceは非同期操作にのみ使用されます。

于 2012-11-26T11:11:12.683 に答える
4

アクセプターが にasync_acceptある場合は、 を呼び出してそのアクセプターip::tcp::acceptor::cancel()の非同期操作をキャンセルできます。これにより、このアクセプターのハンドラーがboost::asio::error::operation_abortedエラー コードで起動される場合があることに注意してください。

synchronous を使用している場合はaccept、まったく関係がないと思うので不可能に思えますio_service

于 2012-11-22T19:36:09.623 に答える
0

私はあなたがこれを少し考えすぎていると思います。条件付きループ内で、非ブロッキング受け入れまたはタイムアウト付きのネイティブ受け入れを使用します。ミューテックス ロックを追加すると、スレッド セーフになります。新しい接続が到着したときに、ネイティブの選択と受け入れを使用することもできます。選択のタイムアウトと条件付きループを設定します。

于 2013-07-12T09:59:22.063 に答える