Forum Programmation.c++ question sur mon architecture logiciel

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
13
jan.
2023

Bonjour a tous :)

j ai une IHM qui doit afficher deux int32_t venant de mon processus processMain. Dans processMain j ai créé 2 shared memory de cette facon:

int fd = -1;
if( (fd=::shm_open("ma_variable1", O_RDWR | O_CREAT, 0644)) < 0)
{
    std::cout << "shm_open error, " << strerror(errno) << std::endl;
}

size_t sizeOfMy_variable1 = ::sizeof(int32_t);

if( ::truncate("/dev/shm/ma_variable1", sizeOfMy_variable1 ) < 0)
{
    std::cout << "truncate error, " << strerror(errno) << std::endl;
}

int32_t* ptr = static_cast<int32_t*>( ::mmap(nullptr, sizeOfMy_variable, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0) );

if( ptr == nullptr)
{
    std::cout << "mmap error, " << strerror(errno) << std::endl;
}
*ptr = 66;

Je peux ainsi récupérer la valeur de variable1 et variable2 a partir de n importe quel autre processus.
Le probleme est que dans mon IHM je n ai aucun moyen de savoir quand est ce que cette variable est modifiée. j ai donc ajouté des futex pour me notifier quand les variables sont changées, un thread de mon IHM agit comme :

while(true)
{
    //futex qui bloque jusqu a que processMain wake mon futex
    int32_t variablle1 = *ptr;
    //je fais des choses
}

ca fonctionne mais j ai donc 2 threads qui run en parallele juste pour etre notifié que les variables sont changées. Bref ca m'a l'air bien pourri comme fonctionnement car si j avais N variables a lire j aurais N threads qui run avec N futex.

Avez vous une idee de comment je pourrais améliorer la chose?
Merci d avance

  • # Tube fifo

    Posté par  (site web personnel) . Évalué à 3.

    Peut être en utilisant un tube ?

    • [^] # Re: Tube fifo

      Posté par  . Évalué à 1. Dernière modification le 13 janvier 2023 à 18:53.

      oui avec une event loop c est pas mal ca me permet de retirer les futex, mais j'aurais donc N tubes pour N variables

  • # Structure ou pointeur sur structure

    Posté par  . Évalué à 3.

    Et avec une structure ou un pointeur sur structure ?

    • [^] # Re: Structure ou pointeur sur structure

      Posté par  . Évalué à 2.

      tu veux dire que mes shared memory ne sont plus deux int32_t mais juste une shared memory d'une structure comme:

      struct{
      int32_t ma_variable1;
      int32_t ma_variable2;
      }

      et mon futex reveille mes autres processus quand je modifie la structure.

      j'ai donc une seul shared memory, une seul structure, un seul futex avec N variables

      Ca m'a l'air super bien, je ne vois aucun incovénient avec cette méthode.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.