2010-07-15 2 views
2

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.

Répondre

9

La liste complète des points d'annulation et de points d'annulation en option est disponible dans les spécifications POSIX:

http://opengroup.org/onlinepubs/007908775/xsh/threads.html

usleep() est un point d'annulation obligatoire

+0

'boost :: thread' sait :) –

+0

+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. –

0

J'ai vu l'arbre d'appel de pthread_testcanel dans l'instrument. application sur Mac OS, qui appelle la fonction OSSpinLockLock.

mais usleep ne semble pas.

Questions connexes