c – 如何安全地停止std线程?

c – 如何安全地停止std线程?,第1张

概述我正在开发一个聊天服务器,我有一个问题. 如何安全地停止std :: thread? 这是非常容易的问题,像这样. thread t(&func);t.join(); 但是,如果func具有无限循环,则join不起作用. 这是我的来源. void CServerSocket::AcceptRun(boost::asio::io_service &iosrv){ while (true) 我正在开发一个聊天服务器,我有一个问题.

如何安全地停止std :: thread?

这是非常容易的问题,像这样.

thread t(&func);t.join();

但是,如果func具有无限循环,则join不起作用.

这是我的来源.

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!");}

我很想知道
请帮帮我.
谢谢.

解决方法 我相当肯定接受将彻底退出,抛出异常,当你关闭接受者.你应该捕获异常以使线程正常退出:
voID CServerSocket::AcceptRun(boost::asio::io_service &iosrv)try {    // your loop here,unchanged} catch (std::exception const & ex) {    // perhaps log the message,ex.what()}

然后在关闭接受者之后加入线程,但在销毁它之前:

CServerSocket::~CServerSocket(){    CLogManager::WriteLog("StopPing Server...");    m_Acceptor->close();    m_AcceptThread.join();    CLogManager::WriteLog("Server Stopped!");    // No need to do anything else with m_Acceptor,assuming it's a smart pointer}

就个人而言,我会使用异步 *** 作,除非有令人信服的理由使用多个线程.单线更容易处理.

总结

以上是内存溢出为你收集整理的c – 如何安全地停止std线程?全部内容,希望文章能够帮你解决c – 如何安全地停止std线程?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1253441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存