Bonjour à tous,
J'ai crée une mémoire partagée entre deux applications. La variable partagée est une structure :
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.
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;
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:
Dès que mon application 1 (APP1) a mis la variable
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... ..... }à 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 data->statusAPP1ToAPP2, 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part while(data->statusAPP1ToAPP2 != READY);
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 ?
Partager