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.
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
Dokumentacja mówi że te funkcje muszą być Punktami anulowania, ale nie mówią, do czego są używane lub co robią. – vy32
Zobacz link I link z tego, co połączyłeś w moim komentarzu powyżej. – alk