我正在开发一个多线程应用程序,其中一个线程充当从客户端接收命令的 tcp 服务器。线程使用 Boost 套接字和接受器等待客户端连接,从客户端接收命令,将命令传递给应用程序的其余部分,然后再次等待。这是代码:
void ServerThreadFunc()
{
using boost::asio::ip::tcp;
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), port_no));
for (;;)
{
// listen for command connection
tcp::socket socket(io_service);
acceptor.accept(socket);
// connected; receive command
boost::array<char,256> msg_buf;
socket.receive(boost::asio::buffer(msg_buf));
// do something with received bytes here
}
}
该线程将大部分时间都花在了对 的调用上acceptor.accept()
。目前,线程仅在应用程序退出时终止。不幸的是,这会在 main() 返回后导致崩溃——我相信是因为线程在单例被销毁后尝试访问应用程序的日志记录单例。(当我来到这里时就是这样,老实说。)
当应用程序退出时,我怎样才能干净地关闭这个线程?我读过原始套接字上的阻塞 accept() 调用可以通过从另一个线程关闭套接字来中断,但这似乎不适用于 Boost 套接字。我尝试使用Boost asynchronous tcp echo server example将服务器逻辑转换为异步 i/o ,但这似乎只是将阻塞调用交换为acceptor::accept()
阻塞调用io_service::run()
,所以我遇到了同样的问题:阻塞我不能打断的电话。有任何想法吗?