ich ein Problem habe mit Valgrind mir zu sagen, ich etwas Speicher möglich verloren haben:pthread_create von pthread_detach gefolgt Ergebnisse noch in möglicherweise verloren Fehler in 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)
Der Code, der diese Fäden (MTPCreateThreadPool) schafft im Grunde bekommt ein Index in einen Block wartender pthread_t-Slots und erstellt daraus einen Thread. TI wird ein Zeiger auf eine Struktur, die einen Thread-Index und ein Pthread_t hat. (Vereinfacht/hygienisiert):
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);
}
Dann haben wir eine Funktion MTPDestroyThreadPool, die durch alle Fäden Schlaufen wir geschaffen und löscht sie (da die MTPHandleRequestsLoop nicht beendet).
for (tindex = 0; tindex < NumThreads; tindex++)
{
pthread_cancel(TP->ThreadInfo[tindex].ThreadHandle);
}
Ich habe an anderer Stelle lesen (andere Fragen hier auf SO einschließlich), dass ein Gewinde Abnehmen explizit diese möglicherweise verloren Fehler verhindern würde, aber es ist eindeutig nicht. Irgendwelche Gedanken?
Es war auch, was ich vorschlagen wollte, und möglicherweise den Rückgabewert von 'Pthread_cancel' testen –
Also wenn einer der Threads (möglicherweise alle) auf einem Semaphor blockieren, wird der Abbruch sofort zurück, aber da sie ' Re blockiert es ist sehr wahrscheinlich, dass der Hauptserver-Prozess beendet wird, bevor sie tatsächlich abbrechen? – alesplin
sem_wait ist ein Abbruchspunkt (http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?cancellation+5). Wenn also der Thread abgebrochen werden kann, sollte die Wartezeit sofort abgebrochen werden. Ein Thread, der sich in einer Endlosschleife dreht, ist ein besserer Kandidat. Sie sollten jedoch zuerst feststellen, ob das passiert, d. H. Ob die Threads abgebrochen werden oder nicht. –