OVH Cloud OVH Cloud

usleep (ou nanosleep) en contexte multitache

1 réponse
Avatar
Alain
Bonjour,
Je me pose la question de l'utilisation de usleep (ou nanosleep) en contexte
multithread, est-ce que seul le thread appellant la fonction est bloqué pour
le temps indiqué ou bien c'est le process qui est concerné, les documents à
ce sujet sur le web (souvent extrait de man) indique l'arrêt du process (ou
du programme). Pouvez vous éclairer ma lanterne ?
Merci,
AR

--
Pour contacter l'équipe de modération : moderateurs-fcolm@efrei.fr
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.

1 réponse

Avatar
Christophe Blaess
> Je me pose la question de l'utilisation de usleep (ou nanosleep) en contexte
multithread, est-ce que seul le thread appellant la fonction est bloqué pour
le temps indiqué ou bien c'est le process qui est concerné, les documents à



Sous Linux, que ce soit avec la bibliothèque LinuxThreads
ou la NPTL, le noyau "voit" distinctement les threads d'une
application. Lorsqu'un appel-système bloquant se produit
(sommeil avec nanosleep, mais également un read() sur
une socket par exemple), il n'endort QUE le thread concerné.

Ceci ne serait pas le cas dans une implémentation des threads
purement en espace utilisateur (comme le faisait la
bibliothèque PcThreads il y a longtemps) car le noyau n'y
verrait qu'un seul processus sans pouvoir distinguer ses
threads.

Remarque, c'est le genre de question à laquelle on peut
facilement trouver la réponse avec un petit test :

#include <pthread.h>
#include <stdio.h>
#include <time.h>

void * thread_1 (void * inutile)
{
struct timespec ts;
ts.tv_sec = 5;
ts.tv_nsec = 0;
nanosleep(& ts, NULL);
fprintf(stderr, "J'ai fini de dormirn");
return NULL;
}

void * thread_2 (void * inutile)
{
int i;
for (i = 0; i < 10; i ++) {
fprintf(stderr, "Je ne suis pas bloque !n");
sleep(1);
}
return NULL;
}

int main(void)
{
pthread_t thr1, thr2;
void * retour;
pthread_create (& thr1, NULL, thread_1, NULL);
pthread_create (& thr2, NULL, thread_2, NULL);
pthread_join(thr2, & retour);
return 0;
}



--
Christophe Blaess
http://www.blaess.fr/christophe/

--
Pour contacter l'équipe de modération :
ATTENTION: Postez DIRECTEMENT vos articles dans le groupe, PAS dans
la liste de distribution des modérateurs.