Namespaces
Variants

std::recursive_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 ( ) ;
(начиная с C++11)

Блокирует мьютекс. Если другой поток уже заблокировал мьютекс, вызов lock заблокирует выполнение до тех пор, пока блокировка не будет получена.

Поток может вызывать lock на рекурсивном мьютексе многократно. Владение будет освобождено только после того, как поток выполнит соответствующее количество вызовов unlock .

Максимальное количество уровней владения не определено. Исключение типа std::system_error будет выброшено, если это число превышено.

Предыдущие unlock() операции на том же мьютексе синхронизируются-с (как определено в std::memory_order ) этой операцией.

Содержание

Исключения

Выбрасывает std::system_error при возникновении ошибок, включая ошибки базовой операционной системы, которые могут помешать lock выполнить свои спецификации. Мьютекс не блокируется в случае выбрасывания любого исключения.

Примечания

lock() обычно не вызывается напрямую: std::unique_lock , std::scoped_lock и std::lock_guard используются для управления эксклюзивной блокировкой.

Пример

Этот пример показывает, как lock и unlock могут использоваться для защиты общих данных.

#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();
}

Возможный вывод:

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

Смотрите также

пытается заблокировать мьютекс, возвращает управление, если мьютекс недоступен
(публичная функция-член)
пытается заблокировать мьютекс, возвращает управление, если мьютекс был
недоступен в течение указанного времени ожидания
(публичная функция-член)
пытается заблокировать мьютекс, возвращает управление, если мьютекс был
недоступен до достижения указанной точки времени
(публичная функция-член)
разблокирует мьютекс
(публичная функция-член)