std::recursive_timed_mutex:: try_lock_for
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
|
recursive_timed_mutex::try_lock_for
|
||||
| Native handle | ||||
|
template
<
class
Rep,
class
Period
>
bool try_lock_for ( const std:: chrono :: duration < Rep, Period > & timeout_duration ) ; |
(начиная с C++11) | |
Пытается заблокировать мьютекс. Блокируется до истечения указанной длительности timeout_duration (таймаут) или до получения блокировки (владение мьютексом), в зависимости от того, что наступит раньше. При успешном получении блокировки возвращает true , в противном случае возвращает false .
Если timeout_duration меньше или равно timeout_duration. zero ( ) , функция ведёт себя как try_lock() .
Эта функция может блокироваться дольше, чем timeout_duration из-за задержек планирования или конкуренции за ресурсы.
Стандарт рекомендует использовать std::steady_clock для измерения длительности. Если реализация использует вместо этого std::system_clock , время ожидания также может быть чувствительным к корректировкам часов.
Как и в случае с try_lock() , этой функции разрешено ложно завершаться неудачей и возвращать false даже если мьютекс не был заблокирован каким-либо другим потоком в какой-то момент в течение timeout_duration .
Предыдущая операция unlock() на том же мьютексе синхронизируется-с (как определено в std::memory_order ) этой операцией, если она возвращает true .
Поток может вызывать
try_lock_for
на рекурсивном мьютексе многократно. Успешные вызовы
try_lock_for
увеличивают счетчик владения: мьютекс будет освобожден только после того, как поток выполнит соответствующее количество вызовов
unlock()
.
Максимальное количество уровней владения не определено. Вызов
try_lock_for
вернет
false
если это число превышено.
Содержание |
Параметры
| timeout_duration | - | минимальная длительность блокировки |
Возвращаемое значение
true если блокировка была успешно получена, в противном случае false .
Исключения
Любое исключение, выброшенное timeout_duration (длительности, предоставляемые стандартной библиотекой, никогда не выбрасывают исключения).
Пример
#include <chrono> #include <iostream> #include <mutex> #include <sstream> #include <thread> #include <vector> using namespace std::chrono_literals; std::mutex cout_mutex; // управление доступом к std::cout std::timed_mutex mutex; void job(int id) { std::ostringstream stream; for (int i = 0; i < 3; ++i) { if (mutex.try_lock_for(100ms)) { stream << "success "; std::this_thread::sleep_for(100ms); mutex.unlock(); } else stream << "failed "; std::this_thread::sleep_for(100ms); } std::lock_guard<std::mutex> lock{cout_mutex}; std::cout << '[' << id << "] " << stream.str() << '\n'; } int main() { std::vector<std::thread> threads; for (int i{0}; i < 4; ++i) threads.emplace_back(job, i); for (auto& th : threads) th.join(); }
Возможный вывод:
[0] failed failed failed [3] failed failed success [2] failed success failed [1] success failed success
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2093 | C++11 |
try_lock_for
не выбрасывал исключений
|
выбрасывает исключения, связанные с таймаутом |
Смотрите также
|
блокирует мьютекс, блокируется если мьютекс недоступен
(public member function) |
|
|
пытается заблокировать мьютекс, возвращает управление если мьютекс недоступен
(public member function) |
|
|
пытается заблокировать мьютекс, возвращает управление если мьютекс
оставался недоступным до достижения указанной точки времени (public member function) |
|
|
разблокирует мьютекс
(public member function) |