odwolanie (cancellation) watku

pthread_cancel, pthread_setcancelstate, pthread_setcanceltype,

pthread_testcancel

Deklaracja

#include <pthread.h>

int pthread_cancel(pthread_t thread);

int pthread_setcancelstate(int state, int *oldstate);

int pthread_setcanceltype(int type, int *oldtype);

void pthread_testcancel(void);

Opis

Odwolanie (cancellation) jest mechanizmem, za ktorego pomoca jeden watek może zakonczyc dzialanie innego watku. Dokladniej watek moze wyslac zadanie odwolania do innego watku. Zaleznie od ustawien watek, do ktorego wyslano

takie zadanie moze je zignorowac, uwzglednic (zakonczyc swoje dzialanie) natychmiast lub odwlec zakonczenie az do osiagniecia pierwszego punktu zwanego cancellation point.  

Jesli watek uwzglegnia zadanie odwolania zachowuje sie tak jakby wywolana byla funkcja pthread_exit (PTHREAD_CANCELLED).

Funkcja pthread_cancel wysyla zadanie odwolania do watku, którego identyfikator jest podany jako argument.

Funkcja pthread_setcancelstate zmienia rodzaj reakcji na zadanie odwolania watku wolajacego ta funkcje. Argumentem jest nowy rodzaj reakcji: PTHREAD_CANCEL_ENABLE umozliwiajacy odwolanie lub PTHREAD_CANCEL_DISABLE powodujacy ignorowanie przychodzacych zadan odwolania. Jesli argument oldstate nie jest NULL poprzedni rodzaj reakcji jest umieszczany w miejscu wskazanym przez ten argument, co umozliwia jego przywrocenie przez ponowne wywolanie funkcji pthread_setcancelstate.

Funkcja pthread_setcanceltype zmienia typ reakcji na zadanie odwolania watku wolajacego ta funkcje. Jej argumentem jest nowy typ reakcji: PTHREAD_CANCEL_ASYNCHRONOUS powodujacy natychmiastowe zakonczenie dzialania watku w momencie odebrania zadania odwolania lub PTHREAD_CANCEL_DEFERRED utrzymujacy dzialanie watku az do osiagniecia pierwszego z tzw. cancellation points. Jesli argument oldstate nie jest NULL poprzedni typ reakcji jest umieszczany w miejscu wskazanym przez ten argument, co umozliwia jego przywrocenie przez ponowne wywolanie funkcji pthread_setcanceltype.

Watki sa zawsze tworzone przez pthread_create z aktywna reakcja na odwolanie jednak dopiero po osiagnieciu cancellation point (PTHREAD_CANCEL_ENABLE i PTHREAD_CANCEL_DEFERRED).

Punkty cancellation points sa miejscami w programie, gdzie wykonywany jest test, czy przypadkiem nie przyszlo zadanie odwolania danego watku i, w razie pozytywnego rezultatu, odwolanie watku jest wykonywane. Standard POSIX ustala nastepujace funkcje jako cancellation points:

pthread_join()

pthread_cond_wait()

pthread_cond_timedwait()

pthread_testcancel()

sem_wait()

sigwait()

Wszystkie inne funkcje zwiazane z watkami typu POSIX nie sa (na pewno!) cancellation points, co oznacza, ze watek nie moze byc odwolany podczas ich wykonywania jesli typ reakcji na odwolanie jest PTHREAD_CANCEL_DEFERRED.

Funkcja pthread_testcancel przeprowadza test, czy nie ma zadania odwolania i ewentualnie odpowiednio reaguje w razie jego istnienia. Funkcja ta jest uzywana przy duzych fragmentach kodu, gdzie nie ma wywolan funkcji, ktore sa cancellation points, i nie ma innej mozliwosci sprawdzenia, czy przyszlo zadanie odwolania.

Funkcja pthread_cancel zawsze zwraca wartosc 0, pthread_setcancelstate i pthread_setcanceltype 0, gdy nie ma bledu i EINVAL, gdy inna niz jedna z ww wartosci podana zostala jako argument.