2010-08-13 9 views
15

Mam wielowątkową aplikację w środowisku POSIX/Linux - Nie mam kontroli nad kodem, który tworzy pthreads. W pewnym momencie proces - właściciel pthreads - odbiera sygnał.Wywołanie API POSIX do wyświetlenia wszystkich pthreadów działających w procesie

Program obsługi tego sygnału powinien przerwać, anulować lub zatrzymać wszystkie pthreads i zarejestrować liczbę uruchomionych pthreadów.

Moim problemem jest to, że nie mogłem znaleźć listy wszystkich uruchomionych pthreadów.

Odpowiedz

20

Nie istnieje żaden przenośny sposób na wyliczenie wątków w procesie.

Linux ma pthread_kill_other_threads_np, który wygląda jak resztka z oryginalnej implementacji pthreads o czysto użytkownika, która może działać, ale nie musi być udokumentowana. Nie mówi ci, ile wątków było.

Możesz uzyskać wiele informacji o swoim procesie, szukając w /proc/self (lub, w przypadku innych procesów, /proc/123). Chociaż wiele unice ma plik lub katalog o tej nazwie, układ jest zupełnie inny, więc każdy kod używający /proc będzie zależał od Linuksa. Dokumentacja /proc jest w Documentation/filesystems/proc.txt w źródle jądra. W szczególności, /proc/self/task ma podkatalog dla każdego wątku. Nazwa podkatalogu jest identyfikatorem LWP; niestety [1][2][3] nie wydaje się być sposób skojarzyć identyfikatory LWP z Pthread identyfikatorów (ale można dostać swój własny identyfikator wątku z gettid(2) jeśli pracujesz dla niego). Oczywiście czytanie /proc/self/task nie jest atomowe; liczba wątków jest dostępna atomicznie przez /proc/self/status (ale oczywiście może się zmienić, zanim podejmiesz odpowiednie działania).

Jeśli nie możesz osiągnąć tego, czego chcesz, dzięki ograniczonemu wsparciu otrzymywanemu od pthreadów na Linuksie, kolejną taktyką jest granie w dynamiczne triki łączące, aby zapewnić własną wersję pthread_create, która loguje się do struktury danych, którą możesz później sprawdzić.

+0

bardzo dziękuję za odpowiedź. Podoba mi się twoje ostatnie rozwiązanie. Zbadam to trochę. Wolałbym unikać czytania/proc/stuff głównie z powodu problemów z przenośnością. –

0

Można zawinąć ps -eLF (lub inne polecenie, które dokładniej czyta tylko ten proces, który Cię interesuje) i przeczytać kolumnę NLWP, aby sprawdzić, ile wątków jest uruchomionych.

+0

Dzięki ale wolałbym pójść do wywołania API - jeśli istnieje. Nie wiem, jak mogłem zatrzymać lub zniszczyć pthreads tym rozwiązaniem. –

+0

@msalvadores, prawda, zatrzymanie wątków z poziomu programu nie działa z moją hacką odpowiedzią - ale możesz wyjść (2) z tego procesu i tam, lub twój operator sygnału mógłby ustawić globalną zmienną, która będzie okresowo odnawiać wątki czek; kiedy jest ustawiony, wątki wychodzą. – sarnold

-4

Biorąc pod uwagę, że wątki są w procesie, powinny one być pod Twoją kontrolą. Możesz nagrywać je wszystkie w strukturze danych i śledzić.

Jednak wykonanie tej czynności nie będzie miało żadnego warunku wyścigowego, chyba że będzie odpowiednio zarządzane (lub tworzysz i dołączasz wątki tylko z jednego wątku).

Wszelkie wątki utworzone przez używane biblioteki są ich działalnością i nie powinieneś się z nimi bawić, gdyż biblioteka może się zepsuć.

Jeśli planujemy zakończyć proces Oczywiście, można po prostu pozostawić wątki działa tak, jak wywołanie exit() kończy je wszystkie.

Pamiętaj, że aplikacja powinna być solidna zderzeniowych bezpieczny i tak, więc nie powinno zależeć od zachowania zamykania systemu, aby uniknąć utraty danych itp

+1

> Biorąc pod uwagę, że wątki są w twoim procesie, powinny one być pod twoją kontrolą: To jest złe. Biblioteki mogą tworzyć procesy, a jeśli używasz innej maszyny wirtualnej, nie masz kontroli nad tworzeniem wątków. –

Powiązane problemy