Bonjour à tous,
j'aurais une petite question concernant l'utilisation des sémaphores, pas vraiment au niveau de l'écriture, mais je cherche la manière de les utiliser au moins dans un cas spécifique.
Mettons que j'ai une fonction verif(), qui me permet de vérifier si une valeur est bien présente dans une mémoire partagée.
Mettons, à côté de cela, que j'ai une fonction ecriture() qui, si une donnée spécifique existe bien dans la mémoire partagée, écrit dans cette mémoire.
Le soucis qui se pose ici, je pense, c'est que si par un malheureux hasard, le programme se fait couper pile au moment après la vérification du SI (dans ecriture()) et avant le SEM_WAIT, et que le processeur lance un autre processus qui lui va se connecter sur la mémoire partagée et la modifier, cela va rendre ma fonction de vérification obsolète...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 int verif(){ SEM_WAIT ...... // traitement vérification SEM_SIGNAL return valeur; } void ecriture(){ SI verif RENVOIE Vrai SEM_WAIT ....... // traitement ecriture SEM_SIGNAL }
Du coup, je me suis dit que je pouvais augmenter la taille de la section critique, et mettre le SEM_WAIT avant le SI, mais dans ce cas je fais double-emploi avec le sémaphore présent dans la fonction verif(), qui restera alors bloqué...
Comment s'en sortir ?
J'ai pensé.. Dans ecriture(), avant le SEM_WAIT, faire une vérification du pid du dernier processus ayant modifié le sémaphore, et si différent du processus en cours, faire un lngjmp juste avant la fonction de vérification, pour la relancer et être sûr d'avoir les valeurs à jour.
Mais j'avoue que, bien que cela me paraisse correct, ça ne me semble pas être une "bonne" manière de faire.
Auriez-vous une idée pour me venir à la rescousse ?
Merci d'avance !
Partager