2014-04-22 13 views
7

Istnieje dyskusja na temat punktów anulowania pthread (http://man7.org/linux/man-pages/man3/pthread_cancel.3.html) na kilka pytań. W niektórych przypadkach respondenci twierdzą, że punktów odwołania nie należy używać, chyba że programista wie, co robią bardzo dobrze.Do czego służą punkty anulowania pthread?

Moje pytanie - do czego służą punkty anulowania Pthread?

[zaktualizowane z komentarzem]

  1. działa punkt anulowanie pozwalają wzywa te specyficzne API zostać odwołany?
  2. Dlaczego te, a nie inne?
  3. Czy ktoś chciałby ich użyć do czegokolwiek innego?
  4. Czy są hackami, aby poradzić sobie z problemem w jądrze, czy są nieodłączne z czymś związanym z POSIX?
  5. Czy chcesz używać punktów anulowania w kodzie na poziomie użytkownika lub tylko w interfejsach API?
+0

Dokumentacja, którą łączysz, odpowiada na twoje pytanie, przynajmniej pod tym linkiem: http://man7.org/linux/man-pages/man7/pthreads.7.html (patrz * Punkty Cancellaton *) – alk

+0

Dokumentacja mówi że te funkcje muszą być Punktami anulowania, ale nie mówią, do czego są używane lub co robią. – vy32

+0

Zobacz link I link z tego, co połączyłeś w moim komentarzu powyżej. – alk

Odpowiedz

3

Czy punkt anulowania pozwala na anulowanie tych specyficznych wywołań interfejsu API?

Trzymanie się za pomocą PTHREAD_CANCEL_DEFERRED może być przyczyną zamieszania. Prawie myślisz o tym od tyłu. Punkt anulowania nie zezwala na anulowanie wywołań systemowych (API w twojej nomenklaturze), a połączenia sprawdzają, czy żądanie anulowania jest w toku. Konceptualnie możesz myśleć o tym jako (ręcznie) ustawiając przełącznik. Automatyczne punkty anulowania sprawdzą, czy jest on włączony, a celowe połączenie z numerem pthread_testcancel można wstawić tam, gdzie jest to wygodne lub potrzebne w inny sposób - na przykład w środku długo działającej pętli obliczeniowej, w której w przeciwnym razie nie byłoby możliwych do odwołania wywołań systemowych. Punkty anulowania automatycznie wymuszają połączenia z dowolnymi programami obsługi oczyszczania pthread, które zostały skonfigurowane i które mogą być powiązane w sposób podobny do wywołań atexit.

Wiele osób wybiera (jeśli jest to wykonalne w ich sytuacji), aby ustawić własny przełącznik i zakodować sposób wyłączania nici w tym punkcie nici podczas sprawdzania przełącznika. PTHREAD_CANCEL_DEFERRED jest w zasadzie na sterydach. Dostarcza (potencjalnie) kilka punktów, w których przełącznik jest koncepcyjnie sprawdzany, a tym samym zmusza twórcę do rozważenia konsekwencji anulowania w każdym z tych punktów.

Dlaczego te, a nie inne?

Będziesz musiał omówić to na zasadzie połączenia przez telefon, ale przede wszystkim z powodu nieprzewidywalnych skutków ubocznych.

Czy chcesz używać punktów anulowania w kodzie na poziomie użytkownika lub tylko w interfejsach API?

Tak, chcesz użyć ich w kodzie na poziomie użytkownika. Ty jako programista jesteś w najlepszej pozycji, aby wiedzieć, jakich zasobów używasz i jak je wyczyścić, jeśli wątek zostanie anulowany, a logiczne implikacje anulowania w dowolnym punkcie.

PTHREAD_CANCEL_ASYNCHRONOUS to kolejna kula wosku i koszmarów własnych. Koncepcyjnie można prawie myśleć o tym jako o wątku wysadzanym sygnałem kill - może on zostać przerwany w dowolnym miejscu - ale daje możliwość uruchomienia procedur obsługi czyszczenia. Problem polega na tym, że naprawdę trudno to zrobić, np. co się stanie, jeśli zostanie anulowane w środku malloc? To sprawia, że ​​jest to zupełnie bezużyteczne poza naprawdę, bardzo dokładnie przemyślanymi sytuacjami.

+1

Aby podkreślić ostatni punkt: wątek w trybie PTHREAD_CANCEL_ASYNCHRONOUS wywołuje niezdefiniowane zachowanie, jeśli wywoła * dowolną standardową funkcję biblioteki * inną niż 'pthread_setcancelstate',' pthread_setcanceltype' lub 'pthread_cancel'. – zwol

+1

To jest najczystszy zwykły angielski opis, który przeczytałem. Jeśli mógłbyś trochę rozwinąć i może to być bardzo pomocne dla ludzi. –

3

... do czego służą punkty anulowania pthread?

Od man 7 pthreads:

punkty anulacji

POSIX.1 określa, że ​​niektóre funkcje muszą, a niektóre inne funkcje mogą być punkty anulowanie.

Więcej:

Jeśli wątek można anulować, jej typ cancelability jest odroczona, a wniosek jest anulowanie oczekiwaniu na wątku, to wątek jest anulowany, gdy wywołuje funkcję to punkt anulowania.

skierowanie pytania:

  1. funkcji API zdefiniowane przez POSIX tutaj: http://man7.org/linux/man-pages/man7/pthreads.7.html (anulacji Punkty) albo punkty odwołania lub może być trochę.
  2. Aby wprowadzić (specyficzny dla użytkownika) punkt anulowania, należy zadzwonić pod numer pthread_testcancel(), w którym może być konieczne.
  3. Nie.
  4. Są zdefiniowane przez POSIX, aby zapewnić standaryzowany sposób obsługi sposobu, w jaki może nastąpić anulowanie. Ma to szczególnie sens w przypadku blokowania funkcji.
  5. zobaczyć 2.

Jako końcowy Uwaga: Unikaj anulowanie nici gdziekolwiek to możliwe, ponieważ może to doprowadzić do nieoczekiwanych i unreproducable zachowanie programu.Staraj się zawsze zaprojektować program, aby móc go zamknąć, kończąc wszystkie wątki bez wyraźnego wywoływania pthread_cancel().

Powiązane problemy