Прервать поток
#include <sys/neutrino.h>int ThreadCancel( int tid,void (*canstub)( void ) );int ThreadCancel_r( int tid,void (*canstub)( void ) );
Необходимо предоставить функцию canstub. |
libc
Эти вызовы ядра запрашивают прерывание потока, определяемого по tid. Состояние прерываемости целевого потока и тип определяют когда именно прерывание случится.
Функции ThreadCancel() и ThreadCancel_r() идентичны, за исключением способа сообщения об ошибках.
Когда происходит прерывание, поток перепрыгивает в место, определяемое 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().
Эти вызовы не блокируют.
-1
, код ошибки записывается в errno. Любое другое возвращенное значение считается успешным завершением.EOK
возвращается при успешном завершении. Функция НЕ устанавливает errno. При возникновении ошибки функция возвращает один из представленных ниже кодов.
ЗОСРВ «Нейтрино»
pthread_cancel(), pthread_setcancelstate(), pthread_setcanceltype(), pthread_testcancel(), ThreadCreate(), ThreadDestroy()
Предыдущий раздел: Описание API системной библиотеки