Thread View: pl.comp.os.linux.programowanie
2 messages
2 total messages
Started by macu
Tue, 04 Oct 2011 21:33
"destruktor" pthread_key_create nie jest wołany dla głównego wątku
Author: macu
Date: Tue, 04 Oct 2011 21:33
Date: Tue, 04 Oct 2011 21:33
68 lines
2743 bytes
2743 bytes
Witam,
dziś naciąłem się na kod który nie zwalnia wszystkich allokacji
a używa TLS z biblioteki pthread.
W wywołaniu pthread_key_create() drugi argument jest funkcją
/destructor/ wołaną po zakończeniu wątku gdy ten zawołał w swoim
kontekście pthread_setspecific().
Niestety okazuje się, że destruktor jest co prawda wywołany
dla wątków, natomiast nie jest wołany dla głównego wątku programu.
Z palca napisałem poniższy kod, więc nie mam pewności czy się
skompiluje od razu poprawnie
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
static pthread_key_t key = -1;
void clean_thr_res( void* par )
{
printf( "%s ptr 0x%X\n", __FUNCTION__, ptr );
free( par );
}
int thread( void* par )
{
void* ptr = malloc( 10 );
printf( "%s ptr 0x%X\n", __FUNCTION__, ptr );
pthread_setspecific( key, ptr );
return 0;
}
int main()
{
pthread_t thr;
// Allokacja i przechowanie w TLS głównego thread'a.
void* ptr = malloc( 10 );
printf( "%s ptr 0x%X\n", __FUNCTION__, ptr );
pthread_key_create( &key, clean_thr_res ); // Inicjuj TLS
pthread_setspecific( key, ptr ); // Przechowaj zasob w TLS
// Testuj z dodatkowego thread'a.
pthread_create( &thr, 0, thread, 0 )
pthread_join( thr, 0 );
return 0;
}
No więc dla powyższego kodu output będzie następujący:
main ptr 0x1234
thread ptr 0x2233
clean_thr_res 0x2233
i niestety allokacja 0x1234 nie bedzie zwolniona.
Nie wygooglałem jawnej informacji że dla głównego wątku /który
pewnie nie jest utworzony pthread_create()/ funkcja podana
w pthread_key_create() nie jest wołana.
Pytanie: czy wiedzieliście o tym zachowaniu pthread i macie jakieś
namiary na informacje opisujące ten problem?
A może znacie jakieś rozwiązanie na to?
Pozdrawiam
Mariusz
Re: "destruktor" pthread_key_create nie jest wołany dla głównego wątku
Author: Wojciech Muła
Date: Sat, 08 Oct 2011 16:54
Date: Sat, 08 Oct 2011 16:54
21 lines
1665 bytes
1665 bytes
On Tue, 04 Oct 2011 23:33:43 +0200 macu <macu@polbox.pl> wrote: > Witam, > > dziś naciąłem się na kod który nie zwalnia wszystkich allokacji > a używa TLS z biblioteki pthread. > > W wywołaniu pthread_key_create() drugi argument jest funkcją > /destructor/ wołaną po zakończeniu wątku gdy ten zawołał w swoim > kontekście pthread_setspecific(). > > Niestety okazuje się, że destruktor jest co prawda wywołany > dla wątków, natomiast nie jest wołany dla głównego wątku programu. W dokumentacji[1] nie piszą nic na temat specjalnego traktowania wątku dla funkcji main. Więc albo dokumentacja albo implementacja kuleje. [1] http://pubs.opengroup.org/onlinepubs/000095399/functions/pthread_key_create.html w.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads