使用Boost :: Asio停止线程服务器循环

Pau*_*aul 5 c++ boost-thread boost-asio

我正在为更大的软件开发一个小型服务器循环,但它不能像我希望的那样工作.

当用户键入".quit"时,我希望软件停止此线程服务器循环:

try {

while (true) {
      acceptor.accept(socket);
      const size_t buffersize = 1024;
      char data[buffersize+1] = {0};
      data[socket.read_some(boost::asio::buffer(data,buffersize))] = '\0'; // Write data & place terminator
      boost::thread asyncWriting(boost::bind( &myClass::writeToFile, this ));
      socket.close();
}

} catch(const boost::system::system_error& e) {
    cout << "Boost System Error: " << e.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)

我按以下方式启动线程:

serverThread = boost::shared_ptr<boost::thread>( new boost::thread(boost::bind( &myClass::startServer, this )) );
Run Code Online (Sandbox Code Playgroud)

但是我在停止"服务器"时遇到了问题.无论我是否中断线程,关闭套接字和/或接受器,或者只是破坏程序Boost会抛出错误:

 Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

它不会每次都发生,但经常发生,我想解决这个问题而不是忽略它.

你能帮助我如何关闭这个倒干净

Sam*_*ler 2

通常服务器是使用异步方法编写的

  • async_accept
  • async_read
  • async_write

在这种情况下,关闭所有挂起的异步操作的建议技术是停止io_service的事件处理循环。注意,要特别注意~io_service 文档

上述销毁序列允许程序通过使用shared_ptr<>来简化其资源管理。如果对象的生命周期与连接(或其他一些异步操作序列)的生命周期相关,则该对象的shared_ptr 将被绑定到与其关联的所有异步操作的处理程序中。

根据您发布的问题所在的有限代码,这对我来说并不明显,我建议发布更多代码或在valgrind下运行您的代码,因为它很可能会暴露一些问题。

几天前我回答了一个类似的问题,你可能会觉得有用