РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
785 of 815 menu

Класс 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,
    который обеспечивает разделяемую блокировку
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить