next up previous contents
Next: Classes d'ordonnancement spécifiques Up: Synchronisation de threads Previous: Sémaphore   Contents

Multiple readers/one writer

Ce mécanisme, comme son nom l'indique, permet de gérer l'accès à une ressource ayant plusieurs lecteurs mais un seul écrivain.

Les fonctions associées sont les suivantes :

Ex : Dans l'exemple ci-dessous, des demandes sont faites pour trouver, ajouter, ou supprimer une connexion à un host. Bien sûr, plusieurs demandes sont possibles, s'il s'agit de trouver l'host rw_lock(), mais une seule demande d'ajout ou de suppression doit exister rw_wrlock(). Dans tous les cas, on libère le r/w lock à la fin.

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


#define FIND 0x01 
#define DELETE 0x02 
#define ADD 0x03 
#define MODIFY 0x04

struct hostpair { 
   char name[MAXHOSTNAME]; 
   unsigned long ipaddr;
   mutex_t lk; 
} he;

struct query { 
   int cmd; 
   int status; struct hostpair he; 
};

extern struct hostpair *lookup(const struct hostpair *); 
extern int find(struct hostpair *); 
extern int delete(struct hostpair *); 
extern int add(struct hostpair *);
rw_lock host_rw;

void HostOp(struct query * hop) { 
   struct hostpair *hp;

   switch(hop->cmd) { 
      case FIND:   rw_lock(&host_rw);
                   hop->status=find(&hop->he); 
                   break; 
      case DELETE: rw_wrlock(&host_rw); 
                   hop->status=delete(&hop->he); break; 
      case ADD:    rw_wrlock(&host_rw); 
                   hop->status=add(&hop->he); 
                   break;
      default:     hop->status=EINVAL; /* Invalid argument */ break; 
   }

   if (hop->status!=EINVAL) rw_unlock(&host_rw);
}



Arnaud Revel
2001-11-26