Я разработал многопоточный прокси-сервер для кэширования OpenWrt (Linux для маршрутизаторов, поэтому доступно немного оперативной памяти). Я использовал библиотеки Boost и Curl, он отлично работает, но потребление ОЗУ не прекращается (утечка памяти).Бесплатные ресурсы, используемые готовой нитью
- Я освобождаю все переменные выделяются динамически
- Я закрыть все открытые файлы
- Почистите инициализирован завиток ручку
- Глобальной переменными являются постоянными
Вот часть моего главным код:
while (true) {
ip::tcp::socket* socket = new ip::tcp::socket(io_service);
acceptor.accept(*socket);
pthread_t thread;
pthread_create(&thread, NULL, handleRequest_thread, (void*) socket);
pthread_detach(thread);
}
Это что утечка памяти происходит «handleRequest_thread», поэтому мой вопрос: Есть ли способ освободить все ресурсы (память, открытые файлы ...) после завершения потока?
У вас могут быть библиотеки, которые выделяют поточно-локальную память, которая в зависимости от реализации библиотеки не всегда уничтожается. Попробуйте конвертировать вашу программу, чтобы использовать пул потоков для перекодирования потоков. Как правило, OpenMP делает это автоматически. Вы можете использовать конструкцию задачи OpenMP, чтобы получить тот же эффект, что и 'pthread_create'. –
После использования только одного потока мое приложение потребляет меньше памяти, но оно все еще растет со временем :-(, я думаю, проблема в libcurl –
с использованием потока на сокет, кажется, лишние накладные расходы для встроенного устройства с ограничениями памяти. один поток, вызывающий «io_service» и асинхронные методы? –