2012-05-13 17 views
5

Pracuję nad projektem, w którym mam główny wątek i jeden wątek demona, aby wykonać wyjście pliku. W moim głównym wątku mam pole pthread_t * _daemon, które chciałbym usunąć, ale oczywiście dopiero po _daemon zwraca NULL (rozumiem, że używanie pthread_exit() powoduje wycieki pamięci).Usuwanie wątku demona tylko po jego zwróceniu

Jak mogę to zrobić bez zajętości-czekaj? Jeśli próbuję użyć zmiennej warunkowej, mam problem - Kiedy zadzwonię pod numer signal() w formularzu _daemon, aby obudzić mój główny wątek, usuwa on _daemon, zanim zwróci NULL.

Po prostu użyłem blokady mutex, która jest zablokowana, gdy program jest uruchamiany i odblokowywany, zanim powróci _daemon. Czy istnieje lepszy sposób, który nie spowodowałby zbyt długiego oczekiwania?

+1

'pthread_join'? – Mat

+0

Nie jest jasne, o co pytasz. Co dokładnie chcesz usunąć? –

+0

Pole pthread_t, ale tylko po przechowywanym wątku demona, zwraca – yotamoo

Odpowiedz

5

pthread_detach() robi to, czego szukasz. Wygląda na to, że rozwiąże on Twój problem (brak przecieków) przy znacznie mniejszej złożoności!

Dzięki temu możesz bezpiecznie zadzwonić pod numer pthread_detatch(_daemon), gdy skończysz z nim w drugim wątku, bez obawy, że wątek nadal działa. Nie kończy się to wątkiem, lecz powoduje, że wątek zostanie oczyszczony, gdy się zakończy.

Z dokumentacji:

Funkcja pthread_detach() podaje do realizacji że dla przechowywania nici nici mogą być odzyskane, gdy ten wątek zakończony. Jeśli wątek nie został zakończony, nie powoduje jego zakończenia. pthread_detach()

Rzeczywiście można utworzyć wątku w jednorodzinnym stanie zacząć ustawiając attr z:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
         void *(*start_routine) (void *), void *arg); 

odpowiednio w tworzeniu czasu. pthread_create() podręcznika mówi:

Kiedy wolnostojący wątek kończy, jego zasoby są automatycznie zwolniony z powrotem do systemu. [snip] Wyodrębnianie wątku jest użyteczne w przypadku niektórych typów demonów wątków, których status wyjścia nie wymaga aplikacji. Domyślnie, jest tworzony nowy wątek w stanie joinable, chyba że attr został ustawiony na utworzyć wątek w stanie odłączonym (przy użyciu pthread_attr_setdetachstate (3)).

+0

Ale _deamon, który chcę zwolnić, znajduje się w głównym wątku, a nie w wątku demona. Chcę usunąć to pole dopiero po zakończeniu wątku demona: – yotamoo

+2

@yotamoo: Obiekt 'pthread_t' może zostać usunięty, zanim wątek powiązany z nim zostanie zwrócony lub jest wykonywany w inny sposób. Sam wątek nie polega na obiekcie 'pthread_t' - usunięcie obiektu' pthread_t' nie niszczy powiązanego wątku. Ale możesz potrzebować wywołania 'pthread_detach()', aby system wiedział, że może wyczyścić wszystkie zasoby wątków, gdy wątek wróci lub zakończy działanie. –

+0

Co dokładnie oznacza "usuń obiekt pthread_t"? – alk

1

pthread_t jest unsigned long int, tak naprawdę nie widzi potrzeby, aby wskaźnik z pthread_t (można również użyć to adres w pthread funkcji), ale jeśli nalegasz, to można go usunąć po tworzenie pthread (ale wtedy nie będziesz miał możliwości komunikowania się z nim, ponieważ jest to liczba stworzonych wątków - używanych do łączenia, odłączania funkcji itp.).

Powiązane problemy