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 Colargol . Évalué à 3.
Peut être en utilisant un tube ?
[^] # Re: Tube fifo
Posté par cosmoff . É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 lann . Évalué à 3.
Et avec une structure ou un pointeur sur structure ?
[^] # Re: Structure ou pointeur sur structure
Posté par cosmoff . É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.
[^] # Re: Structure ou pointeur sur structure
Posté par lann . Évalué à 1.
Oui c'est ça l'idée.
Comme pour le retour d'une fonction ou il n'y a pas qu'une seule variable à renvoyer
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.