std::shared_timed_mutex:: try_lock_for
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Exclusive locking | ||||
|
shared_timed_mutex::try_lock_for
|
||||
| Shared locking | ||||
|
template
<
class
Rep,
class
Period
>
bool try_lock_for ( const std:: chrono :: duration < Rep, Period > & timeout_duration ) ; |
(начиная с C++14) | |
Пытается заблокировать мьютекс. Блокируется до тех пор, пока не истечет указанная продолжительность 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
вызывается потоком, который уже владеет мьютексом в любом режиме (совместном или исключительном), поведение не определено.
Содержание |
Параметры
| 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
Смотрите также
|
блокирует мьютекс, блокируется если мьютекс недоступен
(публичная функция-член) |
|
|
пытается заблокировать мьютекс, возвращает управление если мьютекс недоступен
(публичная функция-член) |
|
|
пытается заблокировать мьютекс, возвращает управление если мьютекс
оставался недоступным до достижения указанной точки времени (публичная функция-член) |
|
|
разблокирует мьютекс
(публичная функция-член) |