Spec-Zone.ru › C++

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

См. также

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/timed_mutex/lock

Spec-Zone.ru

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