Spec-Zone.ru › C++

std::recursive_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
пытается заблокировать мьютекс и возвращает управление, если мьютекс недоступен
(открытая функция-член)
unlock
разблокирует мьютекс
(открытая функция-член)
Документация C для mtx_lock

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

Spec-Zone.ru

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