новре
м енно устанавливает тип от
м ены вызываю
щ его потока равны
м значению, за
д анно
м у пара
м етро
м type, и возвра
щ ает значение предыдущего типа от
м ены в пере
м енной, а
д ресуе
м ой пара
м етро
м oldtype. Допусти
м ы
м и значения
м и
д ля пара
м етра
type являются
PTHREAD_CANCEL_ DEFERRED и
PTHREAD_CANCEL_ASYNCHRONOUS.Состояние и тип отмены любых создаваемых потоков, включал поток, в которо м впервые вызывается функция main(), устанавливаются равны м и значения м PTHREAD_CANCEL_ENABLE и PTHREAD_CANCEL_DEFERRED соответственно.
Функция pthread_testcancel () пре д назначена д ля соз д ания точки от м ены в вызываю щ е м потоке. Функция pthread_testcancel () не и м еет эффекта, если от м ена потока запре щ ена.
Возвращаемые значения
При успешно м завершении функции pthread_setcancelstate() и pthread_ setcanceltype () возвра щ ают нулевое значение; в противно м случае возвра щ ается ко д ошибки, обозначаю щ ий ее характер.
Ошибки
Функция pthread_setcancelstate () м ожет завершиться неу д ачно, если:
[EINVAL] за д анный пара м етр state не со д ержит ни значения PTHREAD_ CANCEL_ENABLE , низначения PTHREAD_CANCEL_DI SABLE.
Функция pthread_setcanceltype () м ожет завершиться неу д ачно, если:
[EINVAL] за д анный пара м етр type не со д ержит ни значения PTHREAD_ CANCEL_DEFERRED, ни значения PTHREAD_CANCEL_ASYNCHRONOUS.
Эти функции не возвра щ ают ко д ошибки [EINTR].
Примеры
Отсутствуют.
Замечания по использованию
Отсутствуют.
Логическое обоснование
Функции pthread_setcancelstate () и pthread_setcanceltype () позволяют управлять точка м и, в которых поток можно асинхронно отменить. Для того чтобы управление отменой потоков можно было осуществлять в соответствии с модульными принципами, необходимо следовать следующим правилам.
Объект можно рассматривать как обобщение некоторой процедуры. Вернее, он представляет собой множество процедур и глобальных переменных, организованных в виде одного модуля, вызываемого клиентами, не известными для этого объекта, причем одни объекты могут зависеть от других.
Во-первых, на входе в объект возможность отмены должна быть запрещена (никогда явно не разрешена). На выходе из объекта состояние отмены должно быть всегда восстановлено до значения, которое оно имело на входе в этот объект.
Это следует из принципа модульности: если клиент объекта (или клиент объекта, использующего данный объект) запретил возможность отмены, это означает, что клиент не желает проведения очистительно-восстановительных операций в случае, если поток будет отменен во время выполнения некоторой важной последовательности действий. Если объект вызывается в таком состоянии и предоставляет возможность отмены, а запрос на отмену задерживается для этого потока, то такой поток отменяется вопреки желанию клиента (т.е. вопреки запрету на отмену).