Поток может прерваться несколькими способами. Первый способ предполагает возвращение управления из основной процедуры
потока start_routine. Второй способ - вызов pthread_exit(), возвращающий статус
выхода. Третий способ - прерывание потока с помощью функции pthread_cancel().
Функция void pthread_exit(void *status)
прерывает выполнение потока точно так же, как функция exit()
прерывает процесс:
#include <pthread.h>
int status;
/* выход возвращает статус status */
pthread_exit(&status);
Функция pthread_exit() заканчивает выполнение вызвавшего
ее потока. Все привязки данных для этого потока освобождаются. Если
вызывающий поток не отделен, то ID этого потока и статус
выхода (status) сохраняются, пока поток блокирован. В противном
случае, статус игнорируется, а ID потока может быть немедленно
использован для другого потока.
Функция pthread_cancel() предназначена для прерывания потока:
#include <pthread.h>
pthread_t thread;
int ret;
ret = pthread_cancel(thread);
Способ обработки запроса на прерывание потока зависит от состояния
указанного потока. Две функции, pthread_setcancelstate()
и pthread_setcanceltype(), определяют это состояние;
функция pthread_cancel() возвращает 0 в случае успешного завершения,
или другое значение в случае ошибки.