Forum Programmation.c++ Mutex avec plusieurs lecteurs simultanés

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
13
juin
2013

Bonjour,
dans le cadre d’une implémentation, je veux accéder à des données depuis plusieurs fils d’exécution. Le nombre de lecture étant très supérieur aux nombres d’écriture, je voudrais utilisé des mutex partagés.

std::mutex monMutex;

void lecture()
{
    monMutex.lock(std::mutex::read);
    
    monMutex.unlock();
}

void ecriture()
{
    monMutex.lock(std::mutex::write);
    
    monMutex.unlock();
}

les lock read ne bloquant que si un lock write est en attente ou en cours. Et le lock write attendant que tous les lock read en cours soit terminé.
Ça s’implémente avec un sémaphore et un mutex assez facilement, mais je voulais savoir si la norme c++11 avait ajouté quelque chose dans le genre. Je n’ai pas l’impression.

  • # shared_mutex ?

    Posté par  . Évalué à 2.

    D'apres http://en.cppreference.com/w/cpp/thread/shared_mutex, ce n'est pas dans c++11, mais c'est prévu pour c++14.

    Par contre, ca existe déja chez boost il me semble.

    • [^] # Re: shared_mutex ?

      Posté par  . Évalué à 2.

      D'apres http://en.cppreference.com/w/cpp/thread/shared_mutex, ce n'est pas dans c++11, mais c'est prévu pour c++14.

      Je n’avais pas trouvé, merci pour le lien. Ça correspond effectivement à mon besoin.

      Par contre, ca existe déja chez boost il me semble.

      Oui, mais dans la mesure du possible, j’essaye d’utiliser le standard avant tout.

      • [^] # Re: shared_mutex ?

        Posté par  . Évalué à 1.

        Il y a de fortes chances que l'API proposée par boost soit la même que celle du futur standard.

        • [^] # Re: shared_mutex ?

          Posté par  . Évalué à 2.

          Ce que j’ai lu de la doc est dure à lire, je trouve. Quand à l’exemple sur stackoverflow ne ressemble pas à ce que je comprends des prémisses de la norme.
          Ce que j’imagine c’est plutôt quelque chose du genre :

          std::shared_mutex monMutex;
          
          void lecture()
          {
              monMutex.lock_shared();
              
              monMutex.unlock_shared();
          }
          
          void ecriture()
          {
              monMutex.lock();
              
              monMutex.unlock();
          }
          
          
          • [^] # Re: shared_mutex ?

            Posté par  . Évalué à 1.

            l'exemple montre comment se servir des shared_lock qui te permettent d'utiliser le RAII avec des mutexes. Ca permet d'eviter les problemes en cas d'exception dans le corps de la fonction, et hop on oublie le unlock()…
            Et il montre aussi comment 'upgrader' un shared_lock, c'est a dire passer de shared/reader à exclusive/writer, et ceci sans unlock() au milieu (tu n'en a pas forcément besoin maintenant, mais ca va peut etre venir).
            A premiere vue, tout ce qui est utilisé dans l'exemple stackoverflow utilise la norme.

Suivre le flux des commentaires

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