Согласно руководствам по Linux, только следующие функции являются точками отмены потоков: pthread_join, pthread_cond_wait, pthread_cond_timedwait, pthread_testcancel, sem_wait, sigwait.В моей тестовой программе поток завершается через usleep.Функция потока:
void* ThreadFunction(void* arg)
{
int n = 0;
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
for(;;)
{
ostringstream s;
s << "Thread iteration " << n++;
PrintLine(s.str().c_str());
usleep(500000);
PrintLine("Check whether thread canceled...");
pthread_testcancel();
PrintLine("Thread is not canceled - continue");
}
pthread_exit(NULL);
}
Когда основная функция выполняет pthread_cancel, я ожидаю, что последней строкой, напечатанной ThreadFunction, будет «Проверить, отменен ли поток ...».Тем не менее, он всегда печатает «Итерация потока ...» перед выходом.Это означает, что usleep является точкой отмены.Я думаю, что это правильно - любая функция сна должна быть отменяемой.Но это не написано в документации.
Если закомментированная строка комментария, последняя строка вывода потока - "Проверьте, отменен ли поток ...", как я ожидаю.