Partage
  • Partager sur Facebook
  • Partager sur Twitter

aparté sur la notion de mutex avec cppreference

C++

    7 février 2019 à 11:32:44

    Bonjour OC

    dans le cadre de mon avancée sur le livre de Mr Scott Meyers, je fais actuellement un nouvel aparté sur la notion de mutex que je commence à bien assimiler.

    Par curiosité , j'ai cherché à compiler et exécuter l'exemple de code à la page: 

    https://en.cppreference.com/w/cpp/thread/mutex

    Or en le faisant, je constate que l'on a systématiquement le résultat suivant à l'exécution :

    http://bar => fake content

    http://foo => fake content

    J'aimerais comprendre pourquoi malgré les nombreuses exécutions que j'ai lancées de ce code, je n'ai jamais :

    http://foo => fake content

    http://bar => fake content

    avec donc foo en premier, puisque à priori, puisque l'on est dans le cadre des threads, il n'y a pas de raison pour que ce ne soit pas foo qui s'affiche en premier. Or j'ai exécuté plusieurs fois le code et c'est toujours dans l'ordre bar, foo que ça s'affiche. 

    Est-ce pareil chez vous ?

    Pour rappel, voici le code issu de la page citée plus haut :

    #include <iostream>
    #include <map>
    #include <string>
    #include <chrono>
    #include <thread>
    #include <mutex>
     
    std::map<std::string, std::string> g_pages;
    std::mutex g_pages_mutex;
     
    void save_page(const std::string &url)
    {
        // simulate a long page fetch
        std::this_thread::sleep_for(std::chrono::seconds(2));
        std::string result = "fake content";
     
        std::lock_guard<std::mutex> guard(g_pages_mutex);
        g_pages[url] = result;
    }
     
    int main() 
    {
        std::thread t1(save_page, "http://foo");
        std::thread t2(save_page, "http://bar");
        t1.join();
        t2.join();
     
        // safe to access g_pages without lock now, as the threads are joined
        for (const auto &pair : g_pages) {
            std::cout << pair.first << " => " << pair.second << '\n';
        }
    }

    Merci par avance pour votre aide

    -
    Edité par pseudo-simple 7 février 2019 à 11:57:04

    • Partager sur Facebook
    • Partager sur Twitter
      7 février 2019 à 11:53:41

      Parce que les résultats sont stockés dans une map et que les éléments sont triés par clé.

      A la limite avec un unordered_map tu as à priori ptet des chances d'avoir des résultats différents, mais sur un programme si court pas sur.

      -
      Edité par Maluna34 7 février 2019 à 11:56:38

      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2019 à 12:46:09

        Si je peux me permettre même si dans ce petit exemple, ca n'aura aucune influence, je rajouterais une pair d'accolade afin d'avoir un contrôle au plus fin sur la durée de vie du mutex:
        void save_page(const std::string &url)
        {
            // simulate a long page fetch
            std::this_thread::sleep_for(std::chrono::seconds(2));
            std::string result = "fake content";
            {  
                std::lock_guard<std::mutex> guard(g_pages_mutex);
                g_pages[url] = result;
            }
                // autre opérations éventuelles.
        }
        • Partager sur Facebook
        • Partager sur Twitter
          7 février 2019 à 13:22:15

          Salut,

          Ou, carrément, au lieu d'utiliser une std::map, j'utiliserais tout simplement un std::vector, et, au lieu d'insérer "fake content" comme valeur, j'insèrerais carrément l'url sensément donnée...

          De cette manière, tu aurais -- au moins -- une petite chance de constater l'ordre dans lequel les différents threads sont arrivés à utiliser le mutex ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait

          aparté sur la notion de mutex avec cppreference

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown