【发布时间】:2013-12-19 12:27:40
【问题描述】:
我正在开发一个聊天服务器,我有一个问题。
如何安全地停止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实际上效果很好。它记录了阻塞行为的事实并不意味着它不起作用。 -
我很确定关闭接受器应该会导致对
accept的调用抛出异常并退出循环。在加入线程之前不要删除接受者。 -
设置条件变量并加入,线程需要检查条件变量并清理,如果它被设置则死亡
-
嗯,我也试过调用join(),但是出现错误“Debug error! R6010 abort() has been called
-
迈克·西摩//哇,谢谢。 join() 非常完美!!!感谢分享。
标签: c++ multithreading join boost-asio