next up previous contents
Next: Sémaphore Up: Synchronisation de threads Previous: Mutex   Contents

Variable condition

Les variables conditions sont utilisées pour bloquer un thread jusqu'à ce qu'une condition soit vérifiée. Un mutex est associé à cette condition. Il est pris par le thread qui trouve la condition vérifiée.

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-24.5)

Ex : Un thread producteur reçoit des informations d'un socket et doit les envoyer à la queue d'une liste chaînée. Pendant ce temps, un processus consomme les données produites. On associe un mutex et une variable condition à la liste. Quand le thread producteur veut accéder à la liste, il demande le mutex associé, met l'information à la queue, signale la disponibilité de l'information et libère le mutex. A l'inverse, le thread consommateur demande le mutex, puis se met en attente de la condition associée au mutex. Il libère alors le mutex et attend que la condition soit satisfaite (c'est la fonction cond_wait() qui permet de faire les 2 actions en même temps). Lorsqu'il est réveillé, il récupère le mutex, lit les informations, et libère finalement le mutex.


typedef struct _node { 
   struct _node *next; 
} NODE;
static NODE list; 
static mutex_t list_lk; 
static cond_t list_cv;
static NODE end_message;

void * consumer(void *arg) 
{ 
   for(;;) { 
      NODE * elemp;
      mutex_lock(&list_lk);
      while(empty_list()) cond_wait(&list_cv, &list_lk);
      elemp=dequeue();
      mutex_unlock(&list_lk);
      if (process(elemp)==0) break; 
   } 
   return(0); 
} 

void *producer(void *arg) { 
   int fd=(int)arg; 
   int n; 
   char buf[BUFSIZE];

   /* Recoit un message d'un socket */
   while((n=recv(fd,buf,BUFSIZE,0))!=-1) { 
   NODE * listp;
   if (n==0) listp=&end_message; 
   else if (!(listp=build_list(buf,n))) continue; 
   mutex_lock(&list_lk);
   enqueue(listp); 
   cond_signal(&list_cv); 
   mutex_unlock(&list_lk);
   if (n==0) break; 
   } 
   close(fd);
   return(0);
}


next up previous contents
Next: Sémaphore Up: Synchronisation de threads Previous: Mutex   Contents
Arnaud Revel
2001-11-26