std::timed_mutex::lock
void lock(); | (начиная с C++11) |
Блокирует мьютекс. Если другой поток уже заблокировал мьютекс, вызов lock будет ожидать получения блокировки.
Если lock вызывается потоком, который уже владеет mutex, поведение не определено: например, программа может попасть в взаимную блокировку. Реализация, способная обнаружить некорректное использование, может выбросить исключение std::system_error с условием ошибки resource_deadlock_would_occur вместо взаимной блокировки.
Предшествующие операции 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/cpp/thread/timed_mutex/lock