我使用Poco :: HTTPServer时遇到问题.正如在TCPServer的文档中所描述的那样:
调用stop()后,不会接受任何新连接,并且将丢弃所有排队连接.但是,已经提供服务的连接将继续提供服务.
每个连接都在自己的线程中执行.虽然似乎析构函数被成功地称为连接线程仍然存在并且提供连接,这导致分段错误.
我想取消所有连接.因此,我Poco::ThreadPool::defaultPool().stopAll();在我的服务器类的析构函数中使用,这导致了ThreadPool文档中描述的行为(它需要10秒,对象不会被删除):
如果一个线程在10秒内未能停止(例如由于编程错误),则不会删除底层线程对象,并且此方法仍会返回.这允许在行为不当线程的情况下或多或少地正常关闭.
我的问题是:我如何实现更优雅的方式?Poco库中是否存在编程错误?
编辑:我使用GNU/Linux(Ubuntu 10.04)和eclipse + cdt作为IDE,目标系统是嵌入式Linux(内核2.6.9).在两个系统上,我都经历了所描述的行为
我正在处理的应用程序应通过Web界面进行配置.因此服务器发送一个事件(在上传新配置时)到main重启.
这是大纲:
main{
while (true){
server = new Server(...);
server->start();
// wait for termination request
server->stop();
delete server;
}
}
class Server{
Poco:HTTPServer m_Server;
Server(...):
m_Server(requestHandlerFactory, socket, params);
{
}
~Server(){
[...]
Poco::ThreadPool::defaultPool().stopAll(); // This takes 10 seconds!
// without the above line I get segmentation faults,
// because connections are still being served.
}
start() { m_Server.start(); }
stop() { m_Server.stop(); }
}
Run Code Online (Sandbox Code Playgroud)