我正在研究一个多线程应用程序,其中一个线程充当从客户端接收命令的tcp服务器.该线程使用Boost套接字和acceptor等待客户端连接,从客户端接收命令,将命令传递给应用程序的其余部分,然后再次等待.这是代码:
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
}
}
Run Code Online (Sandbox Code Playgroud)
这个线程大部分时间都在调用时被阻塞acceptor.accept().此时,线程仅在应用程序退出时终止.不幸的是,这会在main()返回后导致崩溃 - 我相信因为线程在单例被销毁后尝试访问应用程序的日志单例.(当我到这里时,就像那个,诚实的guv.)
当应用程序退出时,如何干净地关闭此线程?我已经读过可以通过从另一个线程关闭套接字来中断原始套接字上的阻塞accept()调用,但这似乎不适用于Boost套接字.我已经尝试使用Boost异步tcp echo服务器示例将服务器逻辑转换为异步i/o ,但这似乎只是为阻塞调用交换acceptor::accept()阻塞调用io_service::run(),所以我留下了同样的问题:一个阻塞打电话我不能打断.有任何想法吗?
在做socket编程的时候,用多线程,
如果线程在 Accept 函数上被阻塞,
并且主线程试图关闭进程,
如何中断接受函数以安全地 pthread_join?
我对如何通过将自身连接到自己的端口以破坏接受功能来执行此操作有模糊的记忆。
任何解决方案将不胜感激。
干杯
我和这个人的情况相同,但我不太明白答案.
问题:
accept阻塞的套接字.close此套接字.解决方案:
你应该做的是向被阻止接受的线程发送信号.这将使它EINTR并且它可以干净地脱离 - 然后关闭插座.请勿从使用它的线程以外的线程中关闭它.
我不知道该做什么 - 当在线程1中接收到信号时,accept已经阻塞,并且在信号处理程序完成后将继续阻塞.
accept立即返回的事情,为什么线程2不能在没有信号的情况下做同样的事情?