Операционные системы. Замятин А.В - 58 стр.

UptoLike

Составители: 

58
Досрочное завершение потока
Функции потоков можно рассматривать как вспомогательные про-
граммы, находящиеся под управлением функции main. Точно так же,
как при управлении процессами иногда возникает необходимость дос-
рочно завершить процесс, многопоточной программе может понадо-
биться досрочно завершить один из потоков. Для досрочного заверше-
ния потока можно воспользоваться функцией pthread_cancel:
int pthread_cancel(pthread_t thread)
Единственным аргументом этой функции является идентификатор
потока thread. Функция pthread_cancel возвращает 0 в случае успеха и
ненулевое значение (код ошибки) в случае ошибки.
Несмотря на то, что pthread_cancel может завершить поток досроч-
но, ее нельзя назвать средством принудительного завершения потоков.
В теле функции потока можно не только самостоятельно выбрать поря-
док завершения в ответ на вызов pthread_cancel, но и вовсе игнориро-
вать этот вызов. Поэтому вызов функции pthread_cancel следует рас-
сматривать как запрос на выполнение досрочного завершения потока.
Функция pthread_setcancelstate определяет, будет ли поток реаги-
ровать на обращение к нему с помощью pthread_cancel или не будет.
Сигнатура функции имеет вид
int pthread_setcancelstate(int state, int* oldstate)
Аргумент state может принимать два значения:
PTHREAD_CANCEL_DISABLE запрет завершения потока;
PTHREAD_CANCEL_ENABLE разрешение на завершение потока.
Во второй аргумент oldstate записывается указатель на предыдущее
значение аргумента state. С помощью функции pthread_setcancelstate
можно указывать участки кода потока, во время исполнения которых
поток нельзя завершить вызовом функции pthread_cancel:
//...
// участок функции, который можно досрочно завершить
//...
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
//...
// участок функции, который нельзя досрочно завершить
//...
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
//...
// участок функции, который можно досрочно завершить
//...