std::recursive_mutex:: lock
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
|
recursive_mutex::lock
|
||||
| Native handle | ||||
|
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 documentation
для
mtx_lock
|
|