Namespaces
Variants

std::timed_mutex:: lock

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
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
void lock ( ) ;
(depuis C++11)

Verrouille le mutex. Si un autre thread a déjà verrouillé le mutex, un appel à lock bloquera l'exécution jusqu'à ce que le verrou soit acquis.

Si lock est appelé par un thread qui possède déjà le mutex , le comportement est indéfini : par exemple, le programme peut se bloquer définitivement. Une implémentation capable de détecter cet usage non valide est encouragée à lever une std::system_error avec la condition d'erreur resource_deadlock_would_occur plutôt que de provoquer un blocage.

Les opérations de unlock() antérieures sur le même mutex synchronisent-avec (tel que défini dans std::memory_order ) cette opération.

Table des matières

Exceptions

Lance std::system_error en cas d'erreurs, y compris les erreurs du système d'exploitation sous-jacent qui empêcheraient lock de respecter ses spécifications. Le mutex n'est pas verrouillé en cas de levée d'une exception.

Notes

lock() n'est généralement pas appelé directement : std::unique_lock , std::scoped_lock , et std::lock_guard sont utilisés pour gérer le verrouillage exclusif.

Exemple

Cet exemple montre comment lock et unlock peuvent être utilisés pour protéger des données partagées.

#include <chrono>
#include <iostream>
#include <mutex>
#include <thread>
int g_num = 0; // protected by g_num_mutex
std::mutex g_num_mutex;
void slow_increment(int id) 
{
    for (int i = 0; i < 3; ++i)
    {
        g_num_mutex.lock(); 
        ++g_num;
        // note, that the mutex also syncronizes the output
        std::cout << "id: " << id << ", g_num: " << g_num << '\n';
        g_num_mutex.unlock();
        std::this_thread::sleep_for(std::chrono::milliseconds(234));
    }
}
int main()
{
    std::thread t1{slow_increment, 0};
    std::thread t2{slow_increment, 1};
    t1.join();
    t2.join();
}

Sortie possible :

id: 0, g_num: 1
id: 1, g_num: 2
id: 1, g_num: 3
id: 0, g_num: 4
id: 0, g_num: 5
id: 1, g_num: 6

Voir aussi

tente de verrouiller le mutex, retourne si le mutex n'est pas disponible
(fonction membre publique)
tente de verrouiller le mutex, retourne si le mutex est resté
indisponible pendant la durée de timeout spécifiée
(fonction membre publique)
tente de verrouiller le mutex, retourne si le mutex est resté
indisponible jusqu'à ce que le point temporel spécifié soit atteint
(fonction membre publique)
déverrouille le mutex
(fonction membre publique)
documentation C pour mtx_lock