Метод lock
Метод lock класса unique_lock
блокирует связанный с объектом мьютекс.
Если мьютекс уже заблокирован другим потоком,
текущий поток будет ожидать освобождения
мьютекса. Метод не принимает параметров и
не возвращает значения. После успешного
вызова метода объект unique_lock
считается владеющим мьютексом.
Метод lock следует вызывать только
в том случае, если объект unique_lock
в данный момент не владеет мьютексом.
В противном случае поведение не определено.
Синтаксис
lock.lock()
Пример
Давайте создадим объект unique_lock
без немедленной блокировки мьютекса, а затем
заблокируем его с помощью метода lock:
#include <iostream>
#include <mutex>
using namespace std;
int main()
{
mutex mtx;
unique_lock<mutex> lock(mtx, defer_lock);
lock.lock();
cout << "Mutex is locked" << endl;
lock.unlock();
return 0;
}
Результат выполнения кода:
"Mutex is locked"
Пример
Давайте рассмотрим пример с двумя потоками,
которые по очереди блокируют один и тот же
мьютекс с помощью метода lock:
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
mutex mtx;
void print(int id)
{
unique_lock<mutex> lock(mtx, defer_lock);
lock.lock();
cout << "Thread " << id << " locked mutex" << endl;
lock.unlock();
}
int main()
{
thread t1(print, 1);
thread t2(print, 2);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"Thread 1 locked mutex"
"Thread 2 locked mutex"
Смотрите также
-
класс
unique_lock,
который управляет блокировкой мьютекса -
метод
unlock,
который разблокирует мьютекс -
метод
try_lock,
который пытается заблокировать мьютекс без ожидания -
метод
lock,
который блокирует мьютекс напрямую