C++11 timed_mutex

一 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)
    
五 参考
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值