2016-07-05 9 views
0

次のコードは安全ですか?非同期呼び出し後にasioソケットを削除する

boost::asio::io_service io_service; 
auto socket(new std::unique_ptr<boost::asio::tcp::socket>(io_service); 
. 
. 
. 
boost::asio::async_read(*socket, buffer, handler); 
socket.reset(); 

また、ソケットを削除する前にハンドラが実行されるのを待つ必要がありますか? また、代わりにsocket->async_receive(...)を使用します。

私はWindowsとLinuxの両方でこれに興味があります。

+0

は 'あなたがソケット上でメッセージを受信するまで、あなたの呼び出し元のスレッドがブロックされます...にも決して起こらない可能性がある)('ソケットのrecvを行います。 – Arunmu

+0

@Arunmu oops、recyncをasync_receiveに変更しました – doron

+0

私はそれを良い考えだとは思いません。そのソケットで読み取りが行われる前にソケットを閉じる理由は何ですか?ハンドラを読んでソケットを閉じたり、タイムアウトを設定したりして、ソケット上の 'cancel'を行い、ソケットを閉じることができます。 – Arunmu

答えて

0

ポインタをリセットすると、ソケット上のデストラクタが呼び出されます。デストラクタ明示的に非同期操作をキャンセルするので、問題ありません。

スレッディングに関する問題があります。型がスレッドセーフではないため、socketの別のメンバーがアクセスされている間は、デストラクタを呼び出すことはできません。

通常のシャットダウンパターンは、それぞれのストランド上のIOオブジェクト(ソケットのような)に対して/または/または操作を行います。サービス自体はstop()に戻り、サービススレッドが戻るのを待ちます。

も関連:Why do we need to use boost::asio::io_service::work?

関連する問題