C++11 timed_mutex

本文详细介绍了C++11中timed_mutex和recursive_timed_mutex的概念及使用方法,包括try_lock_for和try_lock_until函数的具体实现,并通过示例代码展示了如何应用这些互斥锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 timed_mutex
  • 前文C++11 std::mutex中介绍了,mutex 均具有 lock、 try_lock、unlock等成员函数。

  • timed_mutex 增加了带时限的 try_lock。即 try_lock_for、try_lock_until。

  • 定义

    // 头文件 <mutex>
    class timed_mutex; (C++11)
    
二 try_lock_for
  • 定义

    template< class Rep, class Period >
    bool try_lock_for( const std::chrono::duration<Rep,Period>& timeout_duration );(C++11)
    
  • 尝试锁定互斥,若互斥在指定的时限时期中不可用则返回false, 否则返回true。

  • duration 参见此前文章 C++11 std::duration

  • demo

#include <mutex>
#include <iostream>
#include <sstream>
#include <thread>
#include <chrono>

std::mutex cout_mutex;
std::timed_mutex mutex;

using namespace std::chrono_literals;

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() << std::endl;
}

int main() {
  // try_lock_for
  std::vector<std::thread> threads;
  for (int i = 0; i < 4; ++i) {
    threads.emplace_back(job, i);
  }

  for (auto& i : threads) {
    i.join();
  }
}
  • 结果
[1] failed failed success
[0] success failed failed
[3] failed success failed
[2] success success success
三 try_lock_until
  • 定义

    template< class Clock, class Duration >
    bool try_lock_until( const std::chrono::time_point<Clock,Duration>& timeout_time);(C++11)
    
  • 尝试锁定互斥,若直至抵达指定时间点互斥不可用则返回false, 否则返回true。

  • time_point 参见此前文章 C++11 time_point

  • demo

#include <mutex>
#include <iostream>
#include <vector>
#include <thread>
#include <chrono>

std::timed_mutex test_mutex;
using namespace std::chrono;

void f() {
  auto now = steady_clock::now();
  if (test_mutex.try_lock_until(now + 10s)) {
    std::cout << "get lock." << std::endl;
  } else {
    std::cout << "try_lock_util timeout." << std::endl;
  }  
}

int main() {
  // try_lock_until
  auto start = steady_clock::now();
  std::lock_guard<std::timed_mutex> l(test_mutex);
  std::thread t(f);
  t.join();
  auto end = steady_clock::now();
  std::cout << "time use: " << duration_cast<milliseconds>(end-start).count() 
            << "ms." << std::endl;
}
  • 结果
try_lock_util timeout.
time use: 10001ms.
四 recursive_timed_mutex
  • 顾名思义,同时满足 recursive_mutex (参见 C++11 recursive_mutex) 和 timed_mutex 的 mutex。

  • 定义

    // 头文件 <mutex>
    class recursive_timed_mutex;(C++11)
    
五 参考
### 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、付费专栏及课程。

余额充值