pthread_rwlock_rdlock ou pthread_rwlock_tryrdlock Sous-routines
Objectif
Verrouille un objet de verrouillage read-write à des fins de lecture.
Bibliothèque
Bibliothèque d'unités d'exécution (libpthreads.a)
Syntaxe
#include <pthread.h>
int pthread_rwlock_rdlock (rwlock)
pthread_rwlock_t *rwlock;
int pthread_rwlock_tryrdlock (rwlock)
pthread_rwlock_t *rwlock;Descriptif
La fonction pthread_rwlock_rdlock applique un verrou en lecture au verrou read-write référencé par rwlock. L'unité d'exécution appelante acquiert le verrou read si un programme d'écriture ne le détient pas et qu'aucun programme d'écriture n'est bloqué sur le verrou. Il n'est pas précisé si l'unité d'exécution appelante acquiert le verrou lorsqu'un programme d'écriture ne le détient pas et que des programmes d'écriture attendent le verrou. Si un programme d'écriture détient le verrou, l'unité d'exécution appelante n'acquiert pas le verrou en lecture. Si le verrou en lecture n'est pas acquis, l'unité d'exécution appelante se bloque (c'est-à-dire qu'elle ne revient pas du pthread_rwlock_rdlock
call) jusqu'à ce qu'elle puisse acquérir le verrou. Les résultats sont indéfinis si l'unité d'exécution appelante détient un verrou en écriture sur rwlock au moment de l'appel.
Les implémentations sont autorisées à favoriser les auteurs plutôt que les lecteurs pour éviter la famine des auteurs.
Une unité d'exécution peut détenir plusieurs verrous de lecture simultanés sur rwlock (c'est-à-dire qu'elle peut appeler la fonction pthread_rwlock_rdlock n fois). Si tel est le cas, l'unité d'exécution doit effectuer des déverrouillages correspondants (c'est-à-dire qu'elle doit appeler la fonction pthread_rwlock_unlock n fois).
La fonction pthread_rwlock_tryrdlock applique un verrou en lecture comme dans la fonction pthread_rwlock_rdlock , sauf que la fonction échoue si une unité d'exécution détient un verrou en écriture sur rwlock ou si des programmes d'écriture sont bloqués sur rwlock.
Les résultats sont indéfinis si l'une de ces fonctions est appelée avec un verrou read-write non initialisé.
Si un signal est envoyé à une unité d'exécution en attente de lecture d'un verrou read-write , l'unité d'exécution reprend l'attente de lecture du verrou read-write comme s'il n'avait pas été interrompu à son retour du gestionnaire de signaux.
Paramètres
| Article | Descriptif |
|---|---|
| rwlock | Indique le verrou read-write à verrouiller pour la lecture. |
Valeurs renvoyées
En cas de réussite, la fonction pthread_rwlock_rdlock renvoie zéro. Sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.
La fonction pthread_rwlock_tryrdlock renvoie zéro si le verrou de lecture sur l'objet de verrou read-write référencé par rwlock est acquis. Sinon, un numéro d'erreur est renvoyé pour indiquer l'erreur.
Codes d'erreur
La fonction pthread_rwlock_tryrdlock échoue si
| Article | Descriptif |
|---|---|
EBUSY |
Il se peut que le verrou read-write ne soit pas acquis pour lecture car un programme d'écriture détient le verrou ou est bloqué sur celui-ci. |
Les fonctions pthread_rwlock_rdlock et pthread_rwlock_tryrdlock échouent si
| Article | Descriptif |
|---|---|
EINVAL |
La valeur indiquée par rwlock ne fait pas référence à un objet verrou read-write initialisé. |
EDEADLK |
L'unité d'exécution en cours possède déjà le verrou read-write pour l'écriture. |
EAGAIN |
Le verrou read peut ne pas être acquis car le nombre maximal de verrous en lecture pour rwlock est dépassé. |
Caractéristiques de mise en oeuvre
Les applications en temps réel peuvent rencontrer une inversion de priorité lors de l'utilisation de verrous read-write . Le problème se produit lorsqu'une unité d'exécution de priorité élevée'verrouille'un verrou read-write qui est sur le point d'être'déverrouillé'par une unité d'exécution de priorité basse, mais que l'unité d'exécution de priorité basse est préemptée par une unité d'exécution de priorité moyenne. Ce scénario conduit à une inversion de priorité ; une unité d'exécution de priorité élevée est bloquée par des unités d'exécution de priorité inférieure pour une durée illimitée. Lors de la conception du système, les programmeurs en temps réel doivent tenir compte de la possibilité de cette inversion de priorité. Ils peuvent le traiter de plusieurs manières, par exemple en faisant en sorte que les sections critiques qui sont protégées par des verrous read-write s'exécutent à une priorité élevée de sorte qu'une unité d'exécution ne puisse pas être préemptée lors de l'exécution dans sa section critique.