Synchronisation accès mémoire en mémoire partagée
Bonjour à tous,
J'ai crée une mémoire partagée entre deux applications. La variable partagée est une structure :
Code:
1 2 3 4 5 6 7
|
typedef struct
{
unsigned char img[NB_ELEMENTS]; //NB_ELEMENTS est une macro
int statusAPP1ToAPP2, statusAPP2ToAPP1;
} dataShm; |
Au lieu d'utiliser les sémaphores, j'ai pensé à une autre méthode qui consiste à utiliser deux variables (statusAPP1ToAPP2, statusAPP2ToAPP1) qui notifie l'autre application que les données peuvent être lu/écrites.
Dans la suite je vais désigner mes deux applications par APP1 et APP2.
Ainsi, à un endroit du code de APP2 j'ai les lignes suivantes:
Code:
1 2 3 4 5 6 7 8 9 10
|
.... // Initialisation et allocation de la mémoire partagée
// On attend que des données arrivent
while(1){
while(data->statusAPP1ToAPP2 != READY); // Tant que APP1 n'a pas mis à jour cette variable on reste coincé dans la boucle
// La variable data->statusAPP1ToAPP2 a été mise à jour: les données sont prêtes à être traitées...
.....
} |
Dès que mon application 1 (APP1) a mis la variable
Code:
data->statusAPP1ToAPP2
à READY APP2 doit pouvoir traiter les données. Or, APP2 ne sort jamais de la deuxième boucle... En revanche en mettant une instruction usleep(1) juste avant la boucle
Code:
while(data->statusAPP1ToAPP2 != READY);
, le programme arrive à voir que la variable a été modifié à READY et commence à traiter les données. Ce choix de synchronisation est très critiquable cependant j'aimerais bien comprendre ce qui se passe.
Quelqu'un a-t-il une idée de la raison pour laquelle la variable n'est pas mise à jour sans l'instruction usleep... ? J'ai l'impression que la condition data->statusAPP1ToAPP2 != READY n'est pas évalué ... Des suggestions ?