Метод lock
Метод lock класса mutex захватывает мьютекс. Если мьютекс уже захвачен другим потоком, текущий поток блокируется и ждет, пока мьютекс не освободится. Метод не принимает параметров и не возвращает значения. После завершения работы с защищаемыми данными мьютекс необходимо освободить методом unlock.
Синтаксис
mutex.lock()
Пример
Давайте захватим мьютекс методом lock, увеличим общий счетчик и освободим мьютекс методом unlock:
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
mutex mtx;
int counter = 0;
void increment()
{
mtx.lock();
counter++;
cout << "counter = " << counter << endl;
mtx.unlock();
}
int main()
{
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"counter = 1"
"counter = 2"
Пример
Давайте захватим мьютекс в главном потоке и попробуем захватить его повторно в том же потоке. Это приведет к взаимной блокировке:
#include <iostream>
#include <mutex>
using namespace std;
int main()
{
mutex mtx;
mtx.lock();
cout << "First lock acquired" << endl;
mtx.lock();
cout << "Second lock acquired" << endl;
mtx.unlock();
mtx.unlock();
return 0;
}
Результат выполнения кода:
"First lock acquired"
Программа зависнет на втором вызове lock, так как обычный mutex не поддерживает повторный захват одним потоком.
Смотрите также
-
класс
mutex,
который представляет собой примитив синхронизации -
метод
try_lock,
который пытается захватить мьютекс без блокировки -
метод
unlock,
который освобождает захваченный мьютекс -
класс
lock_guard,
который автоматически управляет захватом и освобождением мьютекса