Namespaces
Variants

std:: mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Défini dans l'en-tête <mutex>
class mutex ;
(depuis C++11)

La classe mutex est un primitif de synchronisation qui peut être utilisé pour protéger les données partagées contre un accès simultané par plusieurs threads.

mutex offre une sémantique de propriété exclusive et non récursive :

  • Un thread appelant possède un mutex à partir du moment où il appelle avec succès soit lock soit try_lock jusqu'à ce qu'il appelle unlock .
  • Lorsqu'un thread possède un mutex , tous les autres threads se bloqueront (pour les appels à lock ) ou recevront une valeur de retour false (pour try_lock ) s'ils tentent de revendiquer la propriété du mutex .
  • Un thread appelant ne doit pas posséder le mutex avant d'appeler lock ou try_lock .

Le comportement d'un programme est indéfini si un mutex est détruit alors qu'il est encore détenu par des threads, ou si un thread se termine alors qu'il détient un mutex . La classe mutex satisfait à toutes les exigences de Mutex et de StandardLayoutType .

std::mutex n'est ni copiable ni déplaçable.

Table des matières

Types imbriqués

Nom Définition
native_handle_type ( optionnel* ) défini par l'implémentation

Fonctions membres

construit le mutex
(fonction membre publique)
détruit le mutex
(fonction membre publique)
operator=
[deleted]
non assignable par copie
(fonction membre publique)
Verrouillage
verrouille le mutex, bloque si le mutex n'est pas disponible
(fonction membre publique)
tente de verrouiller le mutex, retourne si le mutex n'est pas disponible
(fonction membre publique)
déverrouille le mutex
(fonction membre publique)
Gestionnaire natif
retourne l'objet gestionnaire natif défini par l'implémentation sous-jacente
(fonction membre publique)

Notes

std::mutex n'est généralement pas accédé directement : std::unique_lock , std::lock_guard , ou std::scoped_lock (depuis C++17) gèrent le verrouillage de manière plus sûre face aux exceptions.

Exemple

Cet exemple montre comment un mutex peut être utilisé pour protéger une std::map partagée entre deux threads.

#include <chrono>
#include <iostream>
#include <map>
#include <mutex>
#include <string>
#include <thread>
std::map<std::string, std::string> g_pages;
std::mutex g_pages_mutex;
void save_page(const std::string& url)
{
    // simuler un long chargement de page
    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();
    // accès sécurisé à g_pages sans verrou maintenant, car les threads sont joints
    for (const auto& [url, page] : g_pages)
        std::cout << url << " => " << page << '\n';
}

Sortie :

http://bar => fake content
http://foo => fake content

Voir aussi

fournit une fonctionnalité d'exclusion mutuelle qui peut être verrouillée récursivement par le même thread
(classe)
(C++11)
implémente un wrapper de propriété de mutex strictement basé sur la portée
(modèle de classe)
implémente un wrapper de propriété de mutex déplaçable
(modèle de classe)
wrapper RAII évitant les interblocages pour plusieurs mutex
(modèle de classe)
fournit une variable de condition associée à un std::unique_lock
(classe)