У меня проблема с Вальгриндом, который говорит мне, что у меня потеряна часть памяти:
==23205== 544 bytes in 2 blocks are possibly lost in loss record 156 of 265
==23205== at 0x6022879: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==23205== by 0x540E209: allocate_dtv (in /lib/ld-2.12.1.so)
==23205== by 0x540E91D: _dl_allocate_tls (in /lib/ld-2.12.1.so)
==23205== by 0x623068D: pthread_create@@GLIBC_2.2.5 (in /lib/libpthread-2.12.1.so)
==23205== by 0x758D66: MTPCreateThreadPool (MTP.c:290)
==23205== by 0x405787: main (MServer.c:317)
Код, который создает эти потоки (MTPCreateThreadPool), в основном получает индекс в блок ожидающих слотов pthread_t,и создает поток с этим.TI становится указателем на структуру, которая имеет индекс потока и pthread_t.(упрощенно / санитарно):
for (tindex = 0; tindex < NumThreads; tindex++)
{
int rc;
TI = &TP->ThreadInfo[tindex];
TI->ThreadID = tindex;
rc = pthread_create(&TI->ThreadHandle,NULL,MTPHandleRequestsLoop,TI);
/* check for non-success that I've omitted */
pthread_detach(&TI->ThreadHandle);
}
Затем у нас есть функция MTPDestroyThreadPool, которая перебирает все созданные нами потоки и отменяет их (поскольку MTPHandleRequestsLoop не завершается).
for (tindex = 0; tindex < NumThreads; tindex++)
{
pthread_cancel(TP->ThreadInfo[tindex].ThreadHandle);
}
Я читал в другом месте (включая другие вопросы здесь о SO), что явное отсоединение потока предотвратит эту возможно потерянную ошибку, но это явно не так.Есть мысли?