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

Класс timed_mutex

Класс timed_mutex - это механизм синхронизации, который расширяет возможности обычного мьютекса. В отличие от mutex, он позволяет потоку пытаться захватить блокировку в течение определенного промежутка времени. Если за это время ресурс не освободился, поток продолжает работу, не дожидаясь бесконечно. Класс предоставляет методы lock, try_lock, try_lock_for, try_lock_until и unlock.

Синтаксис

#include <mutex> std::timed_mutex mtx; mtx.lock(); mtx.try_lock_for(duration); mtx.try_lock_until(time_point); mtx.unlock();

Пример

Давайте рассмотрим пример, где один поток захватывает блокировку и удерживает ее 2 секунды, а второй поток пытается захватить блокировку с таймаутом в 1 секунду:

#include <iostream> #include <thread> #include <mutex> #include <chrono> using namespace std; timed_mutex mtx; void worker1() { mtx.lock(); cout << "worker1 locked" << endl; this_thread::sleep_for(chrono::seconds(2)); mtx.unlock(); cout << "worker1 unlocked" << endl; } void worker2() { this_thread::sleep_for(chrono::milliseconds(100)); if (mtx.try_lock_for(chrono::seconds(1))) { cout << "worker2 locked" << endl; mtx.unlock(); } else { cout << "worker2 timeout" << endl; } } int main() { thread t1(worker1); thread t2(worker2); t1.join(); t2.join(); return 0; }

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

"worker1 locked" "worker2 timeout" "worker1 unlocked"

Пример

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

#include <iostream> #include <thread> #include <mutex> #include <chrono> using namespace std; timed_mutex mtx; void worker1() { mtx.lock(); cout << "worker1 locked" << endl; this_thread::sleep_for(chrono::milliseconds(500)); mtx.unlock(); cout << "worker1 unlocked" << endl; } void worker2() { this_thread::sleep_for(chrono::milliseconds(100)); if (mtx.try_lock_for(chrono::seconds(1))) { cout << "worker2 locked" << endl; mtx.unlock(); } else { cout << "worker2 timeout" << endl; } } int main() { thread t1(worker1); thread t2(worker2); t1.join(); t2.join(); return 0; }

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

"worker1 locked" "worker2 locked" "worker1 unlocked"

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

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