gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:01 24 4
gpt4 key购买 nike

我正在为一个更大的软件开发一个微型服务器循环,但它并没有像我希望的那样工作。

当用户输入“.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;
}

我按以下方式启动线程:

serverThread = boost::shared_ptr<boost::thread>( new boost::thread(boost::bind( &myClass::startServer, this )) );

但是我在停止“服务器”时遇到了问题。无论我是中断线程,关闭套接字和/或接受器,还是只是中断程序,Boost 都会抛出错误:

 Bad file descriptor

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

你能帮我关闭它clean吗?

最佳答案

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

  • async_accept
  • async_read
  • async_write

在这种情况下,关闭所有挂起的异步操作的建议技术是 stop io_service 的事件处理循环。请注意,您应该特别注意 ~io_service documentation

The destruction sequence described above permits programs to simplify their resource management by using shared_ptr<>. Where an object's lifetime is tied to the lifetime of a connection (or some other sequence of asynchronous operations), a shared_ptr to the object would be bound into the handlers for all asynchronous operations associated with it.

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

我回答了一个similar question几天前你可能会觉得有用

关于c++ - 使用 Boost::Asio 停止线程服务器循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4702512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com