Проблема утечки памяти
Я пытаюсь использовать libmicrohttpd с MinGW (входит в состав кодовых блоков 20.03). Я пытаюсь использовать мьютексы и условия для синхронизации доступа к общему ресурсу из почтового запроса. По какой-то причине кажется, что каждый запрос протекает 60 байтов + 1 РУЧКА КЕРНЕЛА (что
Я использую функции pthread_mutex_lock
, pthread_mutex_unlock
, pthread_cond_signal
и pthread_cond_wait
в моем обработчике запросов и внутри al oop в моем основном потоке. Я только один раз вызываю pthread_mutex_init
и pthread_cond_init
во время инициализации основного потока.
Когда я анализирую программу с помощью Dr. Memory, я вижу это повторяется для каждого установленного соединения (main. cpp: 869 - последняя строка моей программы, которая даже не вызывается несколько раз):
Error #1: LEAK 32 direct bytes 0x034101c0-0x034101e0 + 0 indirect bytes
# 0 replace_calloc [d:\drmemory_package\common\alloc_replace.c:2617]
# 1 pthread_spin_init.part.0 [main.cpp:869]
# 2 static_spin_init.part.1 [main.cpp:869]
# 3 pthread_spin_lock [main.cpp:869]
# 4 pthread_getspecific [main.cpp:869]
# 5 _Unwind_SjLj_Register [C:\crossdev\gccmaster\build-tdm32\gcc\mingw32\libgcc/./gthr-default.h:721]
# 6 libmicrohttpd-12.dll!? +0x0 (0x6eb4fa77 <libmicrohttpd-12.dll+0xfa77>)
# 7 libmicrohttpd-12.dll!? +0x0 (0x6eb5030d <libmicrohttpd-12.dll+0x1030d>)
# 8 answer_to_connection [simple-post.cpp:357]
# 9 libmicrohttpd-12.dll!? +0x0 (0x6eb44e3f <libmicrohttpd-12.dll+0x4e3f>)
#10 libmicrohttpd-12.dll!? +0x0 (0x6eb4889c <libmicrohttpd-12.dll+0x889c>)
#11 msvcrt.dll!beginthreadex +0xd0 (0x74c47e71 <msvcrt.dll+0x67e71>)
Error #2: LEAK 28 direct bytes 0x03574e30-0x03574e4c + 0 indirect bytes
# 0 replace_calloc [d:\drmemory_package\common\alloc_replace.c:2617]
# 1 pthread_mutex_init [main.cpp:869]
# 2 mutex_static_init [main.cpp:869]
# 3 mutex_ref [main.cpp:869]
# 4 pthread_mutex_trylock [main.cpp:869]
# 5 mutex_ref_destroy [main.cpp:869]
# 6 pthread_mutex_destroy [main.cpp:869]
# 7 __dyn_tls_pthread@12 [main.cpp:869]
# 8 ntdll.dll!LdrxCallInitRoutine
# 9 ntdll.dll!LdrpCallInitRoutine
#10 ntdll.dll!LdrpCallTlsInitializers
#11 ntdll.dll!LdrShutdownThread
Error #3: HANDLE LEAK: KERNEL handle 0x00000398 and 855 similar handle(s) were opened but not closed:
# 0 system call NtCreateSemaphore
# 1 KERNELBASE.dll!CreateSemaphoreExW
# 2 KERNEL32.dll!CreateSemaphoreExA
# 3 KERNEL32.dll!CreateSemaphoreA
# 4 pthread_mutex_init [main.cpp:869]
# 5 mutex_static_init [main.cpp:869]
# 6 mutex_ref [main.cpp:869]
# 7 pthread_mutex_trylock [main.cpp:869]
# 8 mutex_ref_destroy [main.cpp:869]
# 9 pthread_mutex_destroy [main.cpp:869]
#10 __dyn_tls_pthread@12 [main.cpp:869]
#11 ntdll.dll!LdrxCallInitRoutine
#12 ntdll.dll!LdrpCallInitRoutine
#13 ntdll.dll!LdrpCallTlsInitializers
#14 ntdll.dll!LdrShutdownThread
#15 ntdll.dll!RtlExitUserThread
#16 msvcrt.dll!endthreadex +0x22 (0x74c47ec3 <msvcrt.dll+0x67ec3>)
#17 msvcrt.dll!beginthreadex +0xd6 (0x74c47e77 <msvcrt.dll+0x67e77>)
#18 msvcrt.dll!endthreadex +0x90 (0x74c47f31 <msvcrt.dll+0x67f31>)
#19 KERNEL32.dll!BaseThreadInitThunk
Note: @0:07:31.788 in thread 7416
Обходной путь
Когда я изменяю модель потоков microhttpd на MHD_USE_SELECT_INTERNALLY, утечка памяти исчезает.
Вопрос
Даже если я могу решить проблему, я бы нравится понимать, что я сделал неправильно.
Есть ли что-то, что нужно сделать с мьютексами pthread или условиями, чтобы предотвратить утечку памяти, или что-то нужно сделать в обратных вызовах microhttpd для p Вручную очищать темы на Windows?
Или есть проблема с реализацией pthreads в MinGW?
Исследования
Я нашел это: Отдельные потоки и утечка памяти , но не был уверен, было ли это связано или все еще применяется.