Spec-Zone.ru › C++

std::recursive_timed_mutex::lock

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

См. также

try_lock
пытается заблокировать мьютекс и возвращает управление, если мьютекс недоступен
(открытая функция-член)
try_lock_for
пытается заблокировать мьютекс и возвращает управление, если мьютекс
был недоступен в течение указанного времени ожидания
(открытая функция-член)
try_lock_until
пытается заблокировать мьютекс и возвращает управление, если мьютекс
был недоступен до наступления указанного момента времени
(открытая функция-член)
unlock
разблокирует мьютекс
(открытая функция-член)
Документация по C для mtx_lock

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/recursive_timed_mutex/lock

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API