Поток может прервать свое выполнение несколькими способами:
Первый способ предполагает возвращение управления из основной процедуры
потока start_routine;
Второй способ - вызов pthread_exit(), возвращающий статус
выхода;
Третий способ - прерывание потока с помощью функции pthread_cancel().
Функция
void pthread_exit(void *status);
прерывает выполнение потока точно так же, как функция exit()
прерывает процесс:
#include <pthread.h>
int status;
pthread_exit(&status); /* выход возвращает статус 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 в случае успешного завершения,
или другое значение в случае ошибки.