私はチャットサーバーを開発しており、質問があります。stdスレッドを安全に停止する方法はありますか?
std::thread
を安全に停止する方法はありますか?
このような問題は非常に簡単です。
thread t(&func);
t.join();
ただし、funcに無限ループがある場合、結合は機能しません。
これは私のソースです。
void CServerSocket::AcceptRun(boost::asio::io_service &iosrv)
{
while (true)
{
auto sock = std::make_shared<boost::asio::ip::tcp::socket>(iosrv);
m_Acceptor->accept(*sock);
m_SocketList.push_back(std::make_shared<CConnectionSocket>(this, sock));
}
}
と
CServerSocket::~CServerSocket()
{
CLogManager::WriteLog("Stopping Server...");
m_Acceptor->close();
m_Acceptor.reset();
// m_AcceptThread.detach(); This is right?
CLogManager::WriteLog("Server Stoped!");
}
私は非常に疑問に思っています。 私を助けてください。 ありがとうございます。
'join'は実際にはかなりうまく動作します。それがブロッキング行動を文書化したという事実が、それが機能していないことを意味するわけではありません。 – chris
アクセプタを閉じると 'accept'を呼び出すと例外がスローされ、ループが終了するはずです。スレッドに参加するまでアクセプタを削除しないでください。 –
条件変数を設定して結合すると、スレッドは条件変数とクリーンアップをチェックして、それがセットされると死ぬ必要があります –