Многопоточный процесс, написанный на C, исчерпывает почти всю системную память.Чтобы выяснить поток, который потребляет большую часть памяти ....
Этот вопрос не имеет смысла.По определению все потоки одного и того же процесса совместно используют одно и то же виртуальное адресное пространство .Вы можете запросить его программно, используя proc (5) (например, чтение /proc/self/maps
из вашей программы).
Возможно (и довольно часто), что какая-то кучапамять распределяется (например, с malloc
) в потоке A и будет освобождена (например, free
-d) позже в каком-либо другом потоке B (часто в основном потоке, непосредственно перед выходом).
C динамическое управление памятью куча, по определению , целое свойство программы.
Типичным примером является последний arg
аргумент pthread_create (3) .Это обычно должно быть выделено куча.Вы можете задокументировать и принять соглашение о том, что вызывающий поток (использующий pthread_create
) будет malloc
его, но созданный поток должен free
его (вы можете потребовать, чтобы каждый start_routine
передавался pthread_create
долженfree
что arg
).
Есть какой-нибудь полезный совет для решения проблемы?
Возможно valgrind может помочь вам найти ваш утечки памяти .Вы лучше скомпилируете всю свою программу (и, возможно, некоторые соответствующие библиотеки) с отладочной информацией DWARF (например, скомпилируйте с gcc -g
), а затем перезапустите программу.Но такие ошибки найти сложно, поэтому будьте готовы потратить на них несколько недель.
С концептуальной точки зрения, "теория" сборка мусора (а также умные указатели , RAII , возможно подсчет ссылок и т. Д.) Могут быть полезны.Итак, прочитайте справочник GC (он знакомит с хорошими понятиями и терминологией и объясняет, что управление памятью - это целая проблема программы).Многие понятия там даже актуальны для программ на не-GC-языках, таких как C или C ++.
Вам нужно определить и следовать некоторым достаточно хорошим целым соглашениям программы относительноуправление памятью (и это сложно).