同期読み取りスレッドから別のスレッドでtcp :: socketを閉じることができますか?私は、TCPのdocumentを見[boost.asio] I/Oスレッドとは別のスレッドでtcp :: socketまたはtcp :: acceptorを閉じる
tcp_socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
tcp_socket->close();
::ソケット:
boost::asio::ip::tcp::socket* tcp_socket; //blocking mode
スレッド1:
while(true){
try{
std::vector<char> read_buffer(10);
tcp_socket->read_some(boost::asio::buffer(read_buffer));
}
catch(boost::system::system_error& e){
//TODO
break;
}
}
スレッド2のように に見えます。彼らは、オブジェクトがスレッド非難的であると言います。しかしデモコードはうまくいくようです。 それは安全ですか? tcp :: acceptorはどうですか?同じtcp :: acceptorで、closeを呼び出してマルチスレッドで受け入れる ?
Thanskご返信用
。デモコードを実行します。スレッド1とスレッド2を同期させるロックはありません。tcp_socket-> close()が呼び出された後、thread1は「ファイルの終了」例外をキャッチし、break.Iはこれを合理的な説明とする文書は見つかりませんでした。 – Mamrot
ロックなしで何かが起こる可能性があります。あなたのプラットフォームではおそらく幸運なことですが、それは移植性があるというわけではありません。もう1つの答えが強調されたように、*並行アクセス(つまり、同じオブジェクトに同時にアクセスする2つのスレッド)のようなものは、問題を引き起こします。同時アクセスを禁止すると、スレッド間でオブジェクトを共有することは安全です。 – ComicSansMS