Bonjour à tous,

J'ai crée une mémoire partagée entre deux applications. La variable partagée est une structure :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 à 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?