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

Метод try_lock

Метод try_lock класса mutex пытается захватить мьютекс. В отличие от метода lock, он не блокирует поток выполнения, если мьютекс уже захвачен другим потоком. Метод не принимает параметров. Он возвращает true, если захват произошел успешно, и false, если мьютекс уже занят.

Если метод вернул true, поток становится владельцем мьютекса, и его необходимо освободить с помощью метода unlock. Если метод вернул false, вызывающий поток не владеет мьютексом, и вызывать unlock нельзя.

Синтаксис

mutex.try_lock()

Пример

Давайте создадим мьютекс и попробуем захватить его дважды из одного потока. Первый вызов вернет true, а второй - false, так как мьютекс уже занят:

#include <iostream> #include <mutex> using namespace std; int main() { mutex mtx; bool res1 = mtx.try_lock(); cout << "First try: " << res1 << endl; bool res2 = mtx.try_lock(); cout << "Second try: " << res2 << endl; mtx.unlock(); return 0; }

Результат выполнения кода:

"First try: 1" "Second try: 0"

Пример

Давайте рассмотрим использование метода try_lock в двух потоках. Первый поток захватит мьютекс и будет удерживать его некоторое время, а второй поток попытается захватить мьютекс и получит отказ:

#include <iostream> #include <mutex> #include <thread> #include <chrono> using namespace std; mutex mtx; void worker(int id) { if (mtx.try_lock()) { cout << "Thread " << id << " locked" << endl; this_thread::sleep_for(chrono::milliseconds(500)); mtx.unlock(); cout << "Thread " << id << " unlocked" << endl; } else { cout << "Thread " << id << " failed to lock" << endl; } } int main() { thread t1(worker, 1); this_thread::sleep_for(chrono::milliseconds(50)); thread t2(worker, 2); t1.join(); t2.join(); return 0; }

Результат выполнения кода:

"Thread 1 locked" "Thread 2 failed to lock" "Thread 1 unlocked"

Смотрите также

  • класс mutex,
    который представляет собой примитив синхронизации
  • метод lock,
    который блокирует поток до захвата мьютекса
  • метод unlock,
    который освобождает захваченный мьютекс
  • класс lock_guard,
    который автоматически управляет захватом мьютекса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить