🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#72356
Author: macu
Date: Tue, 04 Oct 2011 21:33
68 lines
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
#72357
Author: Wojciech Muła
Date: Sat, 08 Oct 2011 16:54
21 lines
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