Spec-Zone.ru › C++

std::recursive_timed_mutex::try_lock_until

template< class Clock, class Duration >
bool try_lock_until( const std::chrono::time_point<Clock, Duration>& timeout_time );
(начиная с C++11)

Пытается заблокировать мьютекс. Блокирует поток до наступления указанного момента времени timeout_time (тайм-аута) или до получения блокировки (владения мьютексом) — в зависимости от того, что произойдёт раньше. При успешном получении блокировки возвращает true, в противном случае возвращает false.

Если момент времени timeout_time уже прошёл, эта функция ведёт себя как try_lock().

Clock должен соответствовать требованиям к Clock. Программа некорректна, если std::chrono::is_clock_v<Clock> является false.(начиная с C++20)

Стандарт рекомендует использовать часы, связанные с timeout_time; в этом случае могут учитываться корректировки часов. Поэтому длительность блокировки может быть больше или меньше timeout_time - Clock::now() на момент вызова — в зависимости от направления корректировки и от того, учитывается ли она реализацией. Функция также может блокировать поток и после наступления момента timeout_time из-за задержек планирования процессов или конкуренции за ресурсы.

Как и try_lock(), эта функция может завершиться неудачно без видимой причины и вернуть false, даже если в какой-то момент до наступления timeout_time мьютекс не был заблокирован другим потоком.

Предшествующая операция unlock() над тем же мьютексом синхронизируется-с (как определено в std::memory_order) этой операцией, если она возвращает true.

Поток может многократно вызывать try_lock_until для рекурсивного мьютекса. Успешные вызовы try_lock_until увеличивают счётчик владения: мьютекс будет освобождён только после того, как поток выполнит соответствующее количество вызовов unlock.

Максимальное количество уровней владения не определено. Вызов try_lock_until вернёт false, если это количество будет превышено.

Параметры

timeout_time - максимальный момент времени, до которого поток будет заблокирован

Возвращаемое значение

true, если блокировка успешно получена, в противном случае — false.

Исключения

Любое исключение, выброшенное timeout_time (часы, моменты времени и длительности, предоставляемые стандартной библиотекой, не выбрасывают исключений).

Пример

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

Отчёт об ошибке Применён к Опубликованное поведение Исправленное поведение
LWG 2093 C++11 try_lock_until не выбрасывал исключений выбрасывает исключения, связанные с тайм-аутом

См. также

lock
блокирует мьютекс; если мьютекс недоступен, поток блокируется
(открытая функция-член)
try_lock
пытается заблокировать мьютекс; если мьютекс недоступен, возвращает управление
(открытая функция-член)
try_lock_for
пытается заблокировать мьютекс; если мьютекс недоступен в течение указанного
времени ожидания, возвращает управление
(открытая функция-член)
unlock
разблокирует мьютекс
(открытая функция-член)
Документация по C для mtx_timedlock

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/recursive_timed_mutex/try_lock_until

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API