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); }