2013-06-28 4 views
0

Я разработал многопоточный прокси-сервер для кэширования 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», поэтому мой вопрос: Есть ли способ освободить все ресурсы (память, открытые файлы ...) после завершения потока?

+0

У вас могут быть библиотеки, которые выделяют поточно-локальную память, которая в зависимости от реализации библиотеки не всегда уничтожается. Попробуйте конвертировать вашу программу, чтобы использовать пул потоков для перекодирования потоков. Как правило, OpenMP делает это автоматически. Вы можете использовать конструкцию задачи OpenMP, чтобы получить тот же эффект, что и 'pthread_create'. –

+0

После использования только одного потока мое приложение потребляет меньше памяти, но оно все еще растет со временем :-(, я думаю, проблема в libcurl –

+0

с использованием потока на сокет, кажется, лишние накладные расходы для встроенного устройства с ограничениями памяти. один поток, вызывающий «io_service» и асинхронные методы? –

ответ

0

Вы не можете бесплатно освобождать все ресурсы (только путем выхода из процесса, но это не очень хороший способ). Таким образом, вам нужно контролировать свои ресурсы, использовать интеллектуальные указатели, где вы можете, автоматически закрывать файлы (например, с помощью fstream) и т. Д. Что касается потока: возможно, вам следует использовать boost.thread, он будет следить за тем, чтобы вы не забыли объекты чистой нити (что вы можете легко забыть, используя простые pthreads).

+0

Извините, я не понял последнюю часть о повышении потока, boost.thread автоматически очищает объекты потоков после ее завершения? –

+0

Нет, это не так, пока вы не присоединитесь(), то, что он делает, это чистые ручки потоков, когда переменная выходит за пределы области видимости. Например, с помощью pthreads вам нужно будет самим вызывать чистые функции, поэтому именно это немного более подвержено ошибкам. – Bogolt

+0

Итак, возможно ли решение сделать другой поток, чем основной, соединяющий созданные потоки? поэтому основной поток может обрабатывать другие запросы? –

0

Вы уничтожаете ip::tcp::socket* в отдельной нити, когда она заканчивается? Память для потоков освобождается при соединении, но это не обязательно для отдельных потоков. Ресурсы для отдельного потока возвращаются в систему, когда они заканчиваются. Вы можете проверить статус выхода pthread_detach, если вы можете отсоединить поток.

от человека страниц man pthread_create:

Поток может быть либо соединимым или отдельно. Если поток соединяется, , то другой поток может вызвать pthread_join (3), чтобы ожидание потока до прекратить и получить его статус выхода. Только когда соединительная нить с соединением была соединена, последний из ее ресурсов выпущен обратно в . Когда отдельная нить завершается, ее ресурсы автоматически возвращаются обратно в систему автоматически: : невозможно связать поток , чтобы получить его статус выхода.

Возможно, вы создаете потоки быстрее, чем сможете их завершить, и, следовательно, ваше использование памяти продолжает расти.

+0

yes Я уничтожаю сокет на конец 'handleRequest_thread' –