Согласно справочным страницам 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 является точкой отмены. Я думаю, что это правильно - любая функция сна должна быть отменяемой. Но об этом не написано в документации.
Если строка usleep прокомментирована, последней строкой вывода потока будет "Проверить, отменен ли поток...", как я и ожидал.