У меня проблема с использованием Poco :: HTTPServer.Как описано в документе TCPServer:
После вызова stop () новые соединения не будут приняты, и все соединения в очереди будут отброшены.Однако уже обслуживаемые соединения будут продолжаться.
Каждое соединение выполняется в своем собственном потоке.Хотя кажется, что деструктор успешно называется потоком соединений, он все еще существует и обслуживает соединения, что приводит к ошибкам сегментации.
Я хочу отменить все соединения.Поэтому я использую Poco::ThreadPool::defaultPool().stopAll();
в деструкторе моего серверного класса, что приводит к поведению, также описанному в документах ThreadPool (это занимает 10 секунд и объекты не удаляются):
Если поток не может остановиться в течение 10 секунд (например, из-за ошибки программирования), базовый объект потока не будет удален, и этот метод все равно вернется.Это позволяет более или менее плавно завершать работу в случае неправильного поведения потока.
Мой вопрос: как мне выполнить более изящный путь?Ошибка программирования в Poco-библиотеке?
РЕДАКТИРОВАТЬ: я использую GNU / Linux (Ubuntu 10.04) с eclipse + cdt в качестве IDE, целевой системой является встроенный Linux (Kernel 2.6.9).В обеих системах я испытал описанное поведение.
Приложение, над которым я работаю, должно быть настроено через веб-интерфейс.Таким образом, сервер отправляет событие (при загрузке новой конфигурации) на главный для перезапуска.
Вот схема:
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(); }
}