C++多线程编程之timed_mutex

参考www.cplusplus.com

std::timed_mutex

timed_mutex功能与普通的mutex类似,仅多了两个成员函数try_lock_fortry_lock_until

构造函数

constexpr timed_mutex() noexcept;
timed_mutex (const timed_mutex&) = delete;

新构造的对象处于未上锁状态,不支持拷贝和移动操作。

析构函数

~timed_mutex();

销毁构造的对象,若对象处于上锁状态,会导致undefined behavior

timed_mutex::lock

void lock();

对构造的对象上锁。
若对象还未被任何线程锁住,则调用线程对其上锁;
若对象已经被其他线程锁住,则阻塞调用线程;
若对象已经被调用线程锁住,则再次对其上锁会导致死锁。

timed_mutex::try_lock

bool try_lock();

若构造的对象处于未上锁状态,则调用线程对其上锁,该函数返回true
若构造的对象处于上锁状态,则该函数返回false,但不会阻塞调用线程。
若对象已被调用线程锁住,则再次对其上锁或导致死锁。

timed_mutex::try_lock_for

template <class Rep, class Period>
  bool try_lock_for (const chrono::duration<Rep,Period>& rel_time);

若构造的对象未被任何线程锁住,则调用线程将对其上锁,该函数返回true
若构造的对象已经被其他线程锁住,则调用线程将被阻塞至多rel_time的时间;若在rel_time时间内,对象被解锁,则调用线程将解除阻塞状态,并继续运行;否则,调用线程将被阻塞rel_time时间。该函数返回false
若构造的对象已经被调用线程上锁,则再次对其上锁会导致死锁。

timed_mutex::try_lock_until

template <class Clock, class Duration>
  bool try_lock_until (const chrono::time_point<Clock,Duration>& abs_time);

功能与try_lock_for一样,但需要指定一个绝对时间,而后者需要指定一个相对时间。

timed_mutex::unlock

解锁,释放对其所有权。
若对象当前未被调用线程上锁,将导致undefined behavior

timed_mutex::native_handle

native_handle_type native_handle();
### C++ `std::shared_timed_mutex` 使用方法及示例 #### 头文件包含与对象声明 为了使用 `std::shared_timed_mutex`,需要先包含 `<shared_mutex>` 头文件,并创建锁的对象实例。 ```cpp #include <shared_mutex> std::shared_timed_mutex mutex; ``` 此部分展示了如何准备使用该类型的互斥体[^1]。 #### 锁定操作详解 ##### 独占锁定(写入) 当有线程需要修改受保护的数据时,应采用独占方式加锁。这可以通过 `std::unique_lock<std::shared_timed_mutex>` 实现: ```cpp void writeData() { std::unique_lock<std::shared_timed_mutex> lock(mutex); // 执行写入操作... } ``` 这段代码确保在同一时刻只有一个线程能够持有这个锁来执行写入动作[^4]。 ##### 共享锁定(读取) 对于只需要读取数据而不改变其状态的情况,则可以利用共享模式下的锁——即 `std::shared_lock<std::shared_timed_mutex>`: ```cpp int readData() const { std::shared_lock<std::shared_timed_mutex> lock(mutex); // 进行读取操作... return data; } ``` 这里说明了多个读者可以在不冲突的情况下同时获取资源访问权。 #### 超时尝试锁定功能 除了基本的锁定外,`std::shared_timed_mutex` 提供了一种超时机制,允许调用者指定等待时间以避免无限期挂起。例如: ```cpp if (mutex.try_lock_for(std::chrono::seconds(5))) { try{ // 成功获得锁后的处理逻辑 } finally { mutex.unlock(); } } else { // 如果未能成功取得锁则进入此处分支 } ``` 这种特性使得应用程序能够在一定时间内无法得到所需资源时不陷入死等的状态,而是可以选择采取其他行动或重试策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值