c++ std::timed_mutex 有时限锁定
提供互斥设施,实现有时限锁定
std::timed_mutex
class timed_mutex; (C++11 起)
timed_mutex
类是能用于保护数据免受多个线程同时访问的同步原语。
以类似 mutex 的行为, timed_mutex
提供排他性非递归所有权语义。另外, timed_mutex
提供通过 try_lock_for() 和 try_lock_until() 方法试图带时限地要求 timed_mutex
所有权的能力。
timed_mutex
类满足定时互斥体 (TimedMutex) 与标准布局类型 (StandardLayoutType) 的所有要求。
构造互斥
timed_mutex(); (1) (C++11 起) timed_mutex( const timed_mutex& ) = delete; (2) (C++11 起)
1) 构造互斥。调用后互斥在未锁定状态。
2) 复制构造函数被删除。
参数
(无)
异常
若构造不成功则抛出 std::system_error 。
解锁互斥
void unlock(); (C++11 起)
解锁互斥。
互斥必须为当前执行线程所锁定,否则行为未定义。
此操作同步于(定义于 std::memory_order )任何后继的取得同一互斥所有权的锁操作。
参数 (无)
返回值 (无)
异常 (无)
注意
通常不直接调用 unlock()
:用 std::unique_lock 与 std::lock_guard 管理排他性锁定。
锁定互斥,若互斥不可用则阻塞
void lock(); (C++11 起)
锁定互斥。若另一线程已锁定互斥,则到 lock
的调用将阻塞执行,直至获得锁。
若 lock
为已占有 mutex
的线程调用,则行为未定义:例如,程序可能死锁。鼓励能检测非法使用的实现抛出以 resource_deadlock_would_occur
为错误条件的 std::system_error ,而不是死锁。
同一互斥上先前的 unlock() 操作同步于(定义于 std::memory_order )此操作。
参数 (无)
返回值 (无)
异常
错误发生时抛出 std::system_error ,包括底层操作系统阻止 lock
满足其规定的错误。在抛出任何异常的情况下,不锁定互斥。
注意
通常不直接调用 lock()
:用 std::unique_lock 与 std::lock_guard 管理排他性锁定。
尝试锁定互斥,若互斥不可用则返回
bool try_lock(); (C++11 起)
尝试锁定互斥。立即返回。成功获得锁时返回 true ,否则返回 false 。
允许此函数虚假地失败而返回 false ,即使互斥当前未为任何其他线程所锁定。
若已占有 mutex
的线程调用 try_lock
,则行为未定义。
若此操作返回 true ,则同一互斥上的先前 unlock() 操作同步于(定义于 std::memory_order )它。注意若此操作返回 false ,则先前的 lock() 不与之同步。
参数 (无)
返回值
若成功取得锁则为 true ,否则为 false 。
异常 (无)
尝试锁定互斥,若互斥在指定的时限时期中不可用则返回
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
。
标准推荐用 steady_clock 度量时长。若实现用 system_clock 代替,则等待时间亦可能对时钟调整敏感。
同 try_lock() ,允许此函数虚假地失败并返回 false ,即使在 timeout_duration
中某点互斥不为任何线程所锁定。
若此操作返回 true ,则同一互斥上先前的 unlock() 调用同步于(定义于 std::memory_order )它。
若已占有 mutex
的线程调用 try_lock_for
,则行为未定义。
参数
timeout_duration | - | 要阻塞的最大时长 |
返回值
若成功获得锁则为 true ,否则为 false 。
异常
执行期间时钟、时间点或时长可能抛出的异常(标准库提供的时钟、时间点和时长决不抛出)
代码示例
#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
#include <sstream>std::mutex cout_mutex; // 控制到 std::cout 的访问
std::timed_mutex mutex;void job(int id)
{using Ms = std::chrono::milliseconds;std::ostringstream stream;for (int i = 0; i < 3; ++i) {if (mutex.try_lock_for(Ms(100))) {stream << "success ";std::this_thread::sleep_for(Ms(100));mutex.unlock();} else {stream << "failed ";}std::this_thread::sleep_for(Ms(100));}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& i: threads) {i.join();}
}
可能的输出:
尝试锁定互斥,若直至抵达指定时间点互斥不可用则返回
template< class Clock, class Duration >
bool try_lock_until( const std::chrono::time_point<Clock,Duration>& timeout_time );(C++11 起)
尝试所互斥。阻塞直至抵达指定的 timeout_time
或得到锁,取决于何者先到来。成功获得锁时返回 true ,否则返回 false 。
若已经过 timeout_time
,则此函数表现同 try_lock() 。
使用倾向于 timeout_time
的时钟,这表示时钟调节有影响。从而阻塞的最大时长可能小于但不会大于在调用时的 timeout_time - Clock::now() ,依赖于调整的方向。由于调度或资源争议延迟,函数亦可能阻塞长于抵达 timeout_time
之后。
同 try_lock() ,允许此函数虚假地失败并返回 false ,即使在 timeout_time
前的某点任何线程都不锁定互斥。
若此操作返回 true ,则同一互斥上先前的 unlock() 调用同步于(定义于 std::memory_order )它。
若已占有 mutex
的线程调用 try_lock_until
,则行为未定义。
参数
timeout_time | - | 要阻塞到的最大时间点 |
返回值
若成功获得锁则为 true ,否则为 false 。
异常
执行期间时钟、时间点或时长可能抛出的异常(标准库提供的时钟、时间点和时长决不抛出)
调用示例
#include <thread>
#include <iostream>
#include <chrono>
#include <mutex>std::timed_mutex test_mutex;void f()
{auto now=std::chrono::steady_clock::now();test_mutex.try_lock_until(now + std::chrono::seconds(10));std::cout << "hello world\n";
}int main()
{std::lock_guard<std::timed_mutex> l(test_mutex);std::thread t(f);t.join();
}
c++ std::timed_mutex 有时限锁定相关推荐
- c++ 11 std::recursive_timed_mutex递归锁定的互斥,并实现有时限锁定
定义于头文件 <mutex> std::recursive_timed_mutex class recursive_timed_mutex; (C++11 起) recursive_tim ...
- linux的mutex状态查询命令,如何断言std :: mutex是否已锁定?
使用GCC 4.8.2(在Linux / Debian / Sid 64位上)或GCC 4.9(在C ++ 11中可用)-我有一些互斥锁 std::mutex gmtx; 实际上,它是static某个 ...
- std string与线程安全_C++标准库多线程简介Part1
Part1:线程与互斥量 本篇文章将简单的介绍一下C++的标准线程库,本篇内容十分基础,如果你有C++多线程相关的使用经验或者知识,就不必在这篇文章上浪费时间了... 如果你认为本篇文章对你有帮助,请 ...
- C++11 timed_mutex
目录 一 timed_mutex 二 try_lock_for 三 try_lock_until 四 recursive_timed_mutex 五 参考 一 timed_mutex 前文C++11 ...
- C++11中std::unique_lock的使用
std::unique_lock为锁管理模板类,是对通用mutex的封装.std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即 ...
- std::mutex
C++11中新增了<mutex>,它是C++标准程序库中的一个头文件,定义了C++11标准中的一些互斥访问的类与方法等. C++11标准库定义了4个互斥类: std::mutex std: ...
- Multi-thread--C++11中std::unique_lock的使用
std::unique_lock为锁管理模板类,是对通用mutex的封装.std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即 ...
- Multi-thread--C++11中std::mutex的使用
C++11中新增了<mutex>,它是C++标准程序库中的一个头文件,定义了C++11标准中的一些互斥访问的类与方法等.其中std::mutex就是lock.unlock.std::loc ...
- C++11中std::mutex的使用
原文转载于:https://blog.csdn.net/fengbingchun/article/details/73521630 C++11中新增了<mutex>,它是C++标准程序库中 ...
最新文章
- 如何在Windows7上安装Hyper-v manager
- win8+ubuntu,ubuntu中打开NTFS文件
- linux内核网络协议栈--kernel bridge转发逻辑(十一)
- 第六天2017/04/11(2:Linux内核链表Demo、顺序表、链表的开发与设计)
- ECshop中defined('IN_ECS')的实现原理
- 安利十二个常用的IPython魔法命令
- rnn中文语音识别java_语音识别算法阅读之RNN-T-2018
- jquery ui autocomplete输入中文不自动完成的问题
- qt下实现文件的拖拽打开
- VirtualBox下安装MacOS11
- iOS 项目开发工具JIRA
- activemq后台管理 看topic消息_17 个方面,综合对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 四个分布式消息队列...
- 计算机2级文档试题,计算机二级考试word操作题真题
- pyqt5优秀项目python_基于Pyqt5打造量化系统GUI
- Metasploit之——社会工程学工具包
- xp系统怎么添加ntp服务器,1 Windows xp NTP服务器的配置
- AWS宣布计划在加拿大开设第二个区域
- 网络爬虫异常处理总结
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛 农场阳光(编程大题)
- win10右键一直卡死解决记录
热门文章
- RGCN:record:
- quartz 时间表达式转换
- CustomValidator学习
- 的s健康软件可以测试心率.,小编亲身体验 告诉你手机计步/心率准不准
- me shy是什么歌 抖音make_抖音shy是什么歌 抖音shy歌曲歌词分享
- Android常用的五种布局
- java rowmapper 通用实现_springmvc工具类封装RowMapper详解
- 邮箱学堂:SPF详解
- 3GPP TS 29244-g30 中英文对照 | 5.26.3 Transfer of 5GS bridge port management information
- 我喜欢计算机课 因为它很有趣,我喜欢的一堂课作文