Класс shared_lock
Класс shared_lock представляет собой RAII-обёртку
для управления разделяемой блокировкой мьютекса. Он
автоматически захватывает блокировку в конструкторе и
освобождает её в деструкторе. В отличие от unique_lock,
который даёт эксклюзивный доступ, shared_lock позволяет
нескольким потокам одновременно удерживать блокировку
в режиме чтения. Первым параметром конструктор принимает
мьютекс, поддерживающий разделяемую блокировку (например,
shared_mutex), а вторым - стратегию блокировки.
Синтаксис
#include <shared_mutex>
std::shared_lock<Mutex> lock(mutex);
std::shared_lock<Mutex> lock(mutex, std::defer_lock);
std::shared_lock<Mutex> lock(mutex, std::try_to_lock);
std::shared_lock<Mutex> lock(mutex, std::adopt_lock);
Пример
Давайте создадим shared_mutex и захватим его
в режиме чтения с помощью shared_lock:
#include <iostream>
#include <shared_mutex>
using namespace std;
int main()
{
shared_mutex mtx;
shared_lock<shared_mutex> lock(mtx);
cout << "Lock acquired in shared mode" << endl;
return 0;
}
Результат выполнения кода:
"Lock acquired in shared mode"
Пример
Давайте используем метод owns_lock для проверки,
удерживает ли объект блокировку:
#include <iostream>
#include <shared_mutex>
using namespace std;
int main()
{
shared_mutex mtx;
shared_lock<shared_mutex> lock(mtx);
if (lock.owns_lock()) {
cout << "Lock is held" << endl;
}
return 0;
}
Результат выполнения кода:
"Lock is held"
Пример
Давайте создадим shared_lock с отложенным
захватом и вручную вызовем метод lock:
#include <iostream>
#include <shared_mutex>
using namespace std;
int main()
{
shared_mutex mtx;
shared_lock<shared_mutex> lock(mtx, defer_lock);
cout << "Before lock: " << lock.owns_lock() << endl;
lock.lock();
cout << "After lock: " << lock.owns_lock() << endl;
return 0;
}
Результат выполнения кода:
"Before lock: 0"
"After lock: 1"
Смотрите также
-
класс
shared_mutex,
который поддерживает разделяемую блокировку -
класс
unique_lock,
который обеспечивает эксклюзивную блокировку -
класс
lock_guard,
который автоматически управляет блокировкой -
класс
mutex,
который обеспечивает базовую блокировку