Estoy teniendo un problema con Valgrind que indica que hay algo de memoria posible perdida:pthread_create seguido por pthread_detach todavía provoca error posiblemente perdido en Valgrind
==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: [email protected]@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)
El código que crea estos hilos (MTPCreateThreadPool) básicamente se un índice en un bloque de espera pthread_t slots, y crea un hilo con eso. TI se convierte en un puntero a una estructura que tiene un índice de subproceso y un pthread_t. (Simplificado/desinfectado):
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);
}
entonces tenemos un MTPDestroyThreadPool función que recorre todos los temas que hemos creado y les cancela (ya que el MTPHandleRequestsLoop no sale).
for (tindex = 0; tindex < NumThreads; tindex++)
{
pthread_cancel(TP->ThreadInfo[tindex].ThreadHandle);
}
He leído en otro lugar (incluyendo otras preguntas aquí en SO) que separar un hilo de forma explícita podría evitar este error, posiblemente perdido, pero está claro que no lo es. ¿Alguna idea?
También era lo que estaba a punto de sugerir, y posiblemente probar el valor de retorno de 'pthread_cancel' –
Así que si cualquiera de los hilos (potencialmente todos) están bloqueando en un semáforo, la cancelación volverá inmediatamente, pero ya que ' re bloqueado, ¿es muy probable que el proceso del servidor principal salga antes de que realmente se cancele? – alesplin
sem_wait es un punto de cancelación (http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?cancellation+5), por lo que si el hilo es cancelable, la espera debería cancelarse de inmediato. Un hilo que gira en un ciclo infinito es un mejor candidato. Sin embargo, primero debe establecer si eso es lo que sucede, es decir, si los hilos se cancelan o no. –