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

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