According to the Linux manpages, only the following functions are thread cancellation points: pthread_join, pthread_cond_wait, pthread_cond_timedwait, pthread_testcancel, sem_wait, sigwait. In my test program, thread exits on usleep. Thread function:
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); }
When main function executes pthread_cancel, I expect that last line printed by ThreadFunction is "Check whether thread canceled...". However, it always prints "Thread iteration ..." before exit. This means, usleep is cancellation point. I think that it is correct - any sleep function must be cancellable. But this is not written in documentation.
If usleep line is commented, last thread output line is "Check whether thread canceled...", as I expect.