Namespaces
Variants

std::recursive_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 。成功调用 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++标准。

缺陷报告 适用范围 发布时行为 修正后行为
LWG 2093 C++11 try_lock_for 不抛出任何异常 抛出超时相关异常

参见

锁定互斥锁,若互斥锁不可用则阻塞
(公开成员函数)
尝试锁定互斥锁,若互斥锁不可用则立即返回
(公开成员函数)
尝试锁定互斥锁,若达到指定时间点后互斥锁仍不可用则返回
(公开成员函数)
解锁互斥锁
(公开成员函数)