Класс scoped_lock
Класс scoped_lock представляет собой RAII-обертку для управления одним или несколькими мьютексами. Он был добавлен в стандарт C++17 для решения проблемы взаимной блокировки (deadlock) при захвате нескольких мьютексов одновременно. В конструктор класса scoped_lock мы передаем мьютексы, которые необходимо заблокировать. Блокировка происходит с использованием алгоритма избегания взаимной блокировки, а разблокировка выполняется автоматически в деструкторе при выходе из области видимости.
Синтаксис
std::scoped_lock lock(mutex1, mutex2, ...);
Пример
Давайте рассмотрим базовый пример использования scoped_lock для блокировки одного мьютекса:
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
mutex mtx;
int counter = 0;
void increment()
{
scoped_lock lock(mtx);
counter++;
cout << "Counter: " << counter << endl;
}
int main()
{
thread t1(increment);
thread t2(increment);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"Counter: 1"
"Counter: 2"
Пример
Давайте рассмотрим пример блокировки двух мьютексов одновременно с использованием scoped_lock, что предотвращает взаимную блокировку:
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;
mutex mtx1;
mutex mtx2;
void transfer()
{
scoped_lock lock(mtx1, mtx2);
cout << "Both mutexes locked" << endl;
}
int main()
{
thread t1(transfer);
thread t2(transfer);
t1.join();
t2.join();
return 0;
}
Результат выполнения кода:
"Both mutexes locked"
"Both mutexes locked"
Смотрите также
-
класс
lock_guard,
который обеспечивает блокировку одного мьютекса -
класс
unique_lock,
который предоставляет гибкое управление блокировкой -
метод
lock,
который блокирует мьютекс вручную -
класс
shared_lock,
который обеспечивает разделяемую блокировку