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
См. также
| пытается заблокировать мьютекс, возвращает, если мьютекс недоступен (публичный член-функция) |
|
| разблокирует мьютекс (публичный член-функция) |
|
C документация для mtx_lock |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/recursive_mutex/lock