Rozwiązywanie Problemów Z Czyszczeniem Strumienia C

W ciągu ostatnich kilku dni użytkownicy zgłaszali wyczyszczenie strumienia C.

PTHREAD_CLEANUP_PUSH (3) Przewodnik programowania w systemie Linux PTHREAD_CLEANUP_PUSH (3)

TYTUŁ Powyżej

pthread_cleanup_push, pthread_cleanup_pop – pytaj i wyskakujący wątek Anulowanie opłaca się menedżerowi

PODSUMOWANIE Powyżej

#include

pustka (* procedura) (void pthread_cleanup_push (void *), void * arg); pusty pthread_cleanup_pop (int wykonanie); Kompiluj i kompiluj, które mają -pthread.

OPIS Powyżej

Te funkcje zarządzają starannie stosem wątków wywołującego wątku. Anulowanie sprzątania zwykle przez kierownika. Menedżer sprzątania to prawie każda funkcja a także rozpoczyna się automatycznie, gdy ostrożnie zostanie przerwany (lub różne inne przypadki opisane poniżej); taka moc elektryczna dla Na przykład odblokuj muteks w 100% czysty, aby był dostępny, i tak inni Syn jest bezsprzecznie w procesie. Funkcja pthread_cleanup_push() często wypycha podprogram w górę kilka produktów do przywracania. Kiedy rutyna zostanie oceniona później jest wywoływana, otrzymuje uzasadnienia jako argument. Zatrudnienie Pthread_cleanup_pop () usuwa podprogram na określonej górze przechowuje lub opcjonalnie uruchamia stos menedżera sprzątania, jeśli make ma wartość niezerową. Oczyszczanie procedury obsługi wycofywania jest wyzwalane ze sterty i wykonywane w przypadkach: rozpoznawalny. Kiedy przepływ jest zwykle przerywany, każde z czyszczeń jest zawsze składane Programy obsługi na pewno będą wyświetlane i tworzone w kolejności zmiany w którym spiętrzono dostawców usług. jeden lub para. Jeśli wątek kończy się z pthread_exit (3), wszystkie Menedżerowie sprzątający działają zgodnie z powyższym opisem. Raison. (Menedżerowie sprzątania zwykle nie są opisywani jako bezsprzecznie przepływający) kończy się powrotem dostarczonym przez początek strumienia Funkcjonować.) 3. Gdy dowolny wątek zawiera pthread_cleanup_pop () jedną konkretną niezerową jednostkę kontrolowany argument wyświetla lidera czyszczenia najwyższego poziomu i zakończony. POSIX.1 zezwala na pthread_cleanup_push (), a następnie pthread_cleanup_pop () muszą być zaimplementowane, po prostu dlatego, że makra, które są rozwijane w tworzeniu za pomocą “ powiązane z „” lub nawet z powodu artykułu, dzwoniący powinien upewnić się, że jakie wywołania wielu z tych funkcji są w nich używane? Funkcja i powyżej tego samego poziomu w ramach zagnieżdżenia leksykalnego. (W innych Krótko mówiąc, autokar do sprzątania to tylko to, co można kupić w trakcie Uruchamianie definicji (zobacz tę sekcję dotyczącą kodu). Wywołanie longjmp (3) (siglongjmp (3)) daje niezdefiniowany wynik końcowy w if każde wywołanie pthread_cleanup_push () lub pthread_cleanup_pop () bez połączenia planowania ustawionego z Strumień skoku został wypełniony przez setjmp (3) (sigsetjmp (3)). Podobnie longjmp (3) From (siglongjmp (3)) jest używany w właściciel sam generuje niezdefiniowane wyniki, jeśli nie było bufora zmian również wypełniane za pomocą setjmp (3) (sigsetjmp (3)) w ich programie rozsyłającym.

KOSZT ZWROTU jest wyższy

Te funkcje nie zwracają wartości elementu.

BŁĄD Powyżej

Nie ma tu absolutnie żadnego błędu.

ATRYBUTY Powyżej

Aby uzyskać krótki opis terminów użytych we wszystkich sekcjach, powiedziałbym, że zobacz Atrybuty (7). – – – , – – – – – , – – – … â “‚ Interfejs â “‚ Atrybut â “‚ Znaczenie â “‚ – – * – – – – – Jak na przykład – – – – – — – – – – – – ; – – – – – autorstwa pthread_cleanup_push (), – Bezpieczeństwo wątków – MT-Safe – â ”‚ pthread_cleanup_pop () â ” â ” – Poprzez – – – – – ; – – – – – : – – – € – – – – – – “-” – i – – – – – powierzchnia “…….

DOPASUJ do góry

POSIX.1-2001, POSIX.1-2008.

UWAGI Powyżej

W systemie Linux funkcje pthread_cleanup_push () i pthread_cleanup_pop () Wreszcie φFunkcje są implementowane w porównaniu z makrami, które zamieniają się w tekst. ” i po prostu ” są uwzględnione odpowiednio. Oznacza to, że zmienne rozważono kontekst sparowanych definicji związanych z tymi funkcjami być weryfikowalne tylko w tym zakresie pozytywnie. POSIX.1 pokazał, że rzeczywisty efekt wykorzystania ROI, przerwania, zachowania lub idź, zostaw wcześniej nawiasy bloku pthread_cleanup_push() oprócz / lub pthread_cleanup_pop() są prawdopodobnie niezdefiniowane. Należy tego unikać w aplikacjach przenośnych.

Wyższe

Poniższe narzędzia stanowią prosty przykład, jak używać Funkcje dostarczane na tej stronie. Program komputerowy tworzy strumień który wykonuje jakąś prawą pętlę otoczoną przez pthread_cleanup_push() i pthread_cleanup_pop (). Ta pętla sumuje zmienną globalną, raz cnt, praktycznie drugi. Zgodnie z argumentami wstawiania polecenia hold został dostarczony, główny przewód najprawdopodobniej wyśle ​​inny przewód Polityka anulowania, może zdefiniować globalną zmianę, która dodatkowa nitka, aby wyjść z naszego haka i wyjść normalnie (czas tylko na jeden) Przywrócić). Następnie podczas właściwej sesji maskowania główny wątek jest niewątpliwie identyfikowany jako Anulowanie zapytania technologicznego do wszystkich innych wątków: Dolar ./a.out Nowa wiadomość rozpoczęta technika cnt 0 cnt oznacza 1 Upuść wątek Wezwano kierowników ds. sprzątania Temat zawsze był anulowany; cnt oznacza 0 Z wcześniej wspomnianego, wielu może zobaczyć, że kopanie zostało zakończone i Program formatujący był wywoływany, aby ustawić nadpisanie, a następnie wszystkie wartości zostały zresetowane globalnie odwróć cnt do 0. W układzie obserwacyjnym program główny ustawia odpowiednią dużą zmienną, Wymusza normalne wycofanie innego wątku: Średnia wydajność x Rozpoczęła się nowa rozmowa cnt 0 podobny do cnt oznacza 1 Strumień zatrzymał się normalnie; cnt = 2 Z lepszego powyższego widać, że ostatnio nie uruchomiono pewnego rodzaju menedżera sprzątania (ponieważ cleanup_pop_arg to 0) tak często wartość cnt od wieków nie był resetowany. W kolejnej iteracji struktura podstawowa definiuje zmienną globalną, pomaga okresowo kończyć inny wątek, a także powracać Różne od zera w porównaniu do cleanup_pop_arg: s. / w internecie. 1 Rozpoczęła się nowa rozmowa cnt równa się 0 cnt oznacza 1 Wezwano kierowników ds. sprzątania Transmisja zakończyła się normalnie; cnt = 0 Powyżej moglibyśmy zobaczyć, że choć strumień nie został odwołany, moje kierownictwo sprzątania działało z powodu każdej z tych kłótni pthread_cleanup_pop () ma wartość niezerową. Źródło programu #include

#include # obejmuje #include #include #włącz #define handle_error_en (en, msg) n powinieneś errno równa się en; Komunikat o błędzie); ukończone (EXIT_FAILURE); w tobie (0) static int done musi być równe 0; static int cleanup_pop_arg zwykle wynosi 0; nieaktywny int cnt = 0; Cichy cleanup_handler (nieprawidłowy * argument) printf (“Szef porządkowy o nazwie n”); cnt oznacza 0; Próżnia statyczna * thread_start (nieprawidłowy 2. argument) time_t start, działanie; printf (“Narodził się nowy wątek n”); pthread_cleanup_push (cleanup_handler, NULL); curr = start oznacza cenny czas (NULL); rzeczywistość (! gotowe) pthread_testcancel (); – * Przycisk Anuluj ( pusty ) / if (curr 1) jeśli (argc> 2) cleanup_pop_arg = atoi (argv [2]); udany = 1; inne printf (“Przerwij strumień n”); s oznacza pthread_cancel (thr); jeśli (s! jest takie samo jak 0) handle_error_en (s, “pthread_cancel”); le = pthread_join (th, & res); w dowolnym momencie (s! = 0) handle_error_en (s, “pthread_join”); zakładając (odp == PTHREAD_CANCELED) printf (“Strumień został przerwany; cnt implikuje% d n”, cnt); inne printf (“Temat usunięty normalnie; cnt =% n”, cnt); Wyjście (EXIT_SUCCESS);

ZOBACZ TAKŻE POWYŻEJ

pthread_cancel (3), pthread_cleanup_push_defer_np (3), pthread_setcancelstate (3), pthread_testcancel (3), pthreads (7)

KOLOFON Powyżej

Ta strona jest połączona w wersji bitowej z wersją 5.13 projektu stron podręcznika Red Hat. Opis dotyczący planu, informacje o tym, jak pomóc w zgłoszeniu błędów, i najnowsze tłumaczenie Moja strona użytkownika, więcej można znaleźć w https://www.kernel.org/doc/man-pages/.


c ostrożnie czyszczenie wątków

Strony z linkami do tej strony: pthread_cancel (3), Pthread_cleanup_push_defer_np (3), pthread_exit (3), pthread_setcancelstate (3), pthread_testcancel (3), wątki (7)

C Thread Cleanup
C 스레드 정리
C Pulizia Del Thread
C Tradrensning
C Draad Opruimen
C Thread Cleanup
C Thread Bereinigung
Limpieza De Hilo C
C Ochistka Potoka
C Nettoyage De Fil