C++ 调用stop()和析构函数后,仍然提供Poco HTTPServer连接

C++ 调用stop()和析构函数后,仍然提供Poco HTTPServer连接,c++,linux,multithreading,poco-libraries,C++,Linux,Multithreading,Poco Libraries,我在使用Poco::HTTPServer时遇到问题。如TCPServer文档所述: 调用stop()后,将不接受任何新连接,并且所有 排队的连接将被丢弃。已经提供了连接, 但是,将继续提供服务 每个连接都在自己的线程中执行。 尽管析构函数似乎已成功调用,但连接线程仍然存在并为连接提供服务,这会导致分段错误 我想取消所有连接。因此,我使用Poco::ThreadPool::defaultPool().stopAll()在my server类的析构函数中,这会导致ThreadPool文档中也描述的行

我在使用Poco::HTTPServer时遇到问题。如TCPServer文档所述:

调用stop()后,将不接受任何新连接,并且所有 排队的连接将被丢弃。已经提供了连接, 但是,将继续提供服务

每个连接都在自己的线程中执行。 尽管析构函数似乎已成功调用,但连接线程仍然存在并为连接提供服务,这会导致分段错误

我想取消所有连接。因此,我使用
Poco::ThreadPool::defaultPool().stopAll()在my server类的析构函数中,这会导致ThreadPool文档中也描述的行为(需要10秒并且不会删除对象):

如果线程未能在10秒内停止(由于编程错误 错误(例如),将不会删除基础线程对象 这个方法无论如何都会返回。这就或多或少地允许了 如果线程行为不正常,则正常关机

我的问题是:我如何以更优雅的方式完成任务?编程错误是否在Poco库中

编辑:我使用GNU/Linux(Ubuntu10.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(); }
}

您应该避免使用
Poco::ThreadPool::defaultPool().stopAll()因为它不提供对停止哪些线程的控制

我建议您专门为您创建一个
Poco::ThreadPool
实例
Poco:HTTPServer
并在服务器停止时停止此池的线程

这样,您的代码应该如下所示:

class Server{
    Poco:HTTPServer m_Server;
    Poco::ThreadPool m_threadPool;

    Server(...)
    : m_Server(requestHandlerFactory, m_threadPool, socket, params);
    {

    }

    ~Server(){

    }

    start() { m_Server.start(); }
    stop() { 
        m_Server.stop(); 
        m_threadPool.stopAll(); // Stop and wait serving threads
    }
};

这个答案对于海报来说可能太晚了,但是既然这个问题帮助我解决了我的问题,我认为在这里发布一个解决方案是很好的

这实际上是stopAll()方法实现中的一个bug。关闭当前活动连接后,侦听套接字将被关闭,这允许服务器接受其间的新连接,而新连接将不会关闭并保持运行。解决方法是调用HTTPServer::stop(),然后调用HTTPServer::stopAll()。我向上游报告了错误,包括建议的修复:


poco标记:表示普通的旧CLR对象,一个不遵循任何对象模型、约定或框架的简单对象。不知怎么说,我认为你不应该说,如果有人回答,那么有人会为PoCO C++库创建一个标签,这对项目来说已经太迟了,但对我来说,已经太迟了,我再次看到这个问题,我看到POCO::httpServer现在有一个方法StutalAU.(),它可以取消所有当前连接。我不认为它在2011年有过这样的情况……
Poco::HTTPServer::stopAll()
单独使用并不能解决这个问题。如果我使用
stop
然后使用
stopAll
,我的测试就会通过。。。但是在阅读代码之后,我看到
stopAll
只不过是向连接线程发送一个事件(本质上是异步的),然后调用
stop
。。。因此,我对使用
stopAll
不是很有信心。无论如何,谢谢你两年后接受我的回答!