Selon les pages de manuel Linux, seules les fonctions suivantes sont des points d'annulation de thread: pthread_join, pthread_cond_wait, pthread_cond_timedwait, pthread_testcancel, sem_wait, sigwait. Dans mon programme de test, les threads sortent sur sleep. Fonction du fil:Est-ce que usleep crée un point d'annulation de thread?
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); }
Lorsque la fonction principale exécute pthread_cancel, je pense que la dernière ligne imprimée par ThreadFunction est « Vérifiez si fil annulé ... ». Cependant, il imprime toujours "Thread itération ..." avant de quitter. Cela signifie que le sommeil est le point d'annulation. Je pense que c'est correct - toute fonction de sommeil doit être annulable. Mais ceci n'est pas écrit dans la documentation.
Si la ligne usleep est commentée, la dernière ligne de sortie du thread est "Vérifiez si le thread est annulé ...", comme je l'espère.
'boost :: thread' sait :) –
+1: Presque exactement ce que j'allais dire. Voici une autre URL (plus tard [POSIX] (http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_09) standard) pour les mêmes informations. –