Namespaces
Variants

std::timed_mutex:: try_lock_for

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
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 вызывается потоком, который уже владеет мьютексом, поведение не определено.

Содержание

Параметры

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)