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 не выбрасывал исключений | выбрасывает исключения, связанные с тайм-аутом |
См. также
| блокирует мьютекс; если мьютекс недоступен, поток блокируется (открытая функция-член) |
|
| пытается заблокировать мьютекс; если мьютекс недоступен, возвращает управление (открытая функция-член) |
|
| пытается заблокировать мьютекс; если мьютекс недоступен в течение указанного времени ожидания, возвращает управление (открытая функция-член) |
|
| разблокирует мьютекс (открытая функция-член) |
|
Документация по 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