Mam problem z Valgrind mówi mi, że mam jakąś pamięć możliwą przegrane:pthread_create następnie pthread_detach nadal skutkuje ewentualnie utracone błędu w 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)
kod, który tworzy te wątki (MTPCreateThreadPool) w zasadzie dostaje indeks do bloku oczekujących gniazd pthread_t i tworzy z tym wątek. TI staje się wskaźnikiem do struktury, która ma indeks wątku i pthread_t. (Uproszczony/odkażane):
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);
}
Następnie mamy MTPDestroyThreadPool funkcyjny że pętle przez wszystkich wątków, które stworzyliśmy i anuluje ich (ponieważ MTPHandleRequestsLoop nie exit).
for (tindex = 0; tindex < NumThreads; tindex++)
{
pthread_cancel(TP->ThreadInfo[tindex].ThreadHandle);
}
czytałem gdzie indziej (w tym inne pytania tutaj na SO), że odłączenie wątku wyraźnie uniemożliwiłoby to ewentualnie utracone błąd, ale to oczywiście nie jest. jakieś pomysły?
To było również to, co miałem zasugerować, i ewentualnie przetestować wartość zwracaną 'pthread_cancel' –
Więc jeśli któryś z wątków (potencjalnie wszystkie) blokuje semafor, anulowanie natychmiast powróci, ale ponieważ ' ponownie zablokowane jest całkowicie prawdopodobne, że proces głównego serwera zakończy się, zanim faktycznie anuluje? – alesplin
sem_wait jest punktem anulowania (http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?cancellation+5), więc jeśli wątek będzie można anulować, oczekiwanie powinno zostać anulowane natychmiast. Wirowanie nici w nieskończonej pętli jest lepszym kandydatem. Należy jednak najpierw ustalić, czy tak się dzieje, tj. Czy wątki zostaną anulowane, czy nie. –