Spec-Zone.ru › C++

std::recursive_timed_mutex::lock

void lock();
(since 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/w/cpp/thread/recursive_timed_mutex/lock

Spec-Zone.ru

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