Утечка памяти при использовании libmircohttpd MHD_USE_THREAD_PER_CONNECTION в Windows - PullRequest
0 голосов
/ 20 апреля 2020

Проблема утечки памяти

Я пытаюсь использовать 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?

Исследования

Я нашел это: Отдельные потоки и утечка памяти , но не был уверен, было ли это связано или все еще применяется.

...