小编Mic*_*ael的帖子

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

我使用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)

c++ linux multithreading poco-libraries

4
推荐指数
1
解决办法
2689
查看次数

标签 统计

c++ ×1

linux ×1

multithreading ×1

poco-libraries ×1