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
См. также
| пытается заблокировать мьютекс, возвращает, если мьютекс недоступен (публичный член-функция) |
|
| пытается заблокировать мьютекс, возвращает, если мьютекс был недоступен в течение заданного времени ожидания (публичный член-функция) |
|
| пытается заблокировать мьютекс, возвращает, если мьютекс был недоступен до достижения заданного момента времени (публичный член-функция) |
|
| разблокирует мьютекс (публичный член-функция) |
|
Документация на 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