ThreadCancel(), ThreadCancel_r()

Прервать поток

Прототип:

#include <sys/neutrino.h>
int ThreadCancel( int tid,
void (*canstub)( void ) );
int ThreadCancel_r( int tid,
void (*canstub)( void ) );

Аргументы:

tid
Идентификатор потока, который необходимо уничтожить, возвращаемый функцией ThreadCreate().
canstub
Указатель на место, в которое должен перепрыгнуть поток, когда случится прерывание.

Note: Необходимо предоставить функцию canstub.

Библиотека:

libc

Описание:

Эти вызовы ядра запрашивают прерывание потока, определяемого по tid. Состояние прерываемости целевого потока и тип определяют когда именно прерывание случится.

Функции ThreadCancel() и ThreadCancel_r() идентичны, за исключением способа сообщения об ошибках.


Note: Вместо прямого использования вызовов ядра, обратите внимание на pthread_cancel().

Когда происходит прерывание, поток перепрыгивает в место, определяемое canstub. Эта заглушка должна вызвать обработчики очистки при прерывании для потока. Когда закончит работу последний обработчик, заглушка должна завершить поток, используя:

ThreadDestroy( 0, -1, PTHREAD_CANCEL );

В отличие от ThreadDestroy(), которая немедленно уничтожает поток, ThreadCancel() вызывает для целевого потока код очистки, а затем завершает его при первой возможности.

Обработка прерываний в целевом потоке выполняется асинхронно по отношению к вызывающему потоку.

Комбинации состояний и типов прерываемости приведены ниже:

Состояние Тип Описание
Disabled Deferred Запросы на прерывание находятся в ожидании
Disabled Async Запросы на прерывание находятся в ожидании
Enabled Deferred Прерывание случится в следующей точке прерывания. Это явно закодированные вызовы pthread_testcancel() или попытка войти в заблокированное состояние в любом из описанных ниже вызовов. Все блокируемые вызовы ядра являются точками прерывания, кроме MsgSendvnc() и SyncMutexLock().
Enabled Async Прерывание случится немедленно.

Используйте pthread_setcancelstate() и pthread_setcanceltype() для установки состояния и типа.

POSIX определяет список функций, которые являются точками прерываний; некоторые функции, не приведённые ниже, тоже являются точками прерывания. Любая функция, вызывающся блокирующий вызов ядра, который является точкой прерывания, сама станет точкой прерывания, после того, как сделан вызов ядра. Самый частый блокирующий вызов ядра - MsgSendv().

Состояния блокировки:

Эти вызовы не блокируют.

Возвращаемое значение:

ThreadCancel()
Если возникла ошибка функция возвращает -1, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.
ThreadCancel_r()
EOK возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.

Коды ошибок:

ESRCH
Не существует потока с таким tid.

Классификация:

ЗОСРВ «Нейтрино»

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

pthread_cancel(), pthread_setcancelstate(), pthread_setcanceltype(), pthread_testcancel(), ThreadCreate(), ThreadDestroy()




Предыдущий раздел: Описание API системной библиотеки