stdthread(6)并发mutex
1. mutex是用来保证线程同步的,防止不同的线程同时操作同一个共享数据
1.1 C++11四种互斥量
std::mutex,最常用,普遍的互斥量(默认属性),独占式互斥量
std::recursive_mutex ,允许同一线程使用recursive_mutext多次加锁,然后使用相同次数的解锁操作解锁(mutex多次加锁会造成死锁)
std::timed_mutex,允许超时的独占式互斥量,在mutex上增加了时间的属性。增加了两个成员函数try_lock_for(),try_lock_until(),分别接收一个时间范围,再给定的时间内如果互斥量被锁主了,线程阻塞,超过时间,返回false。
std::recursive_timed_mutex,允许超时的递归式互斥量,增加递归和时间属性
1.2 函数
- lock(),互斥量加锁,如果互斥量已被加锁,线程阻塞
- bool try_lock(),尝试加锁,如果互斥量未被加锁,则执行加锁操作,返回true;如果互斥量已被加锁,返回false,线程不阻塞。
- void unlock(),解锁互斥量
2. 例子
int cnt = 20;std::mutex m;void t1(){while (cnt > 0){ m.lock();if (cnt > 0){//sleep(1);--cnt;std::cout << "t1 " << cnt << std::endl;}m.unlock(); }}void t2(){while (cnt > 0){m.lock();if (cnt > 0){--cnt;std::cout << "t2 " << cnt << std::endl;}m.unlock();}}int test(void){std::thread th1(t1);std::thread th2(t2);th1.join(); //等待t1退出th2.join(); //等待t2退出std::cout << "test" << std::endl;return 0;}
输出结果会有多种,但cnt是依次递减的
t1 19
t1 18
t1 17
t1 16
t1 15
t1 14
t1 13
t1 12
t1 11
t1 10
t1 9
t1 8
t1 7
t2 6
t2 5
t2 4
t2 3
t2 2
t2 1
t2 0
mutex test或t1 19
t1 18
t1 17
t1 16
t1 15
t1 14
t1 13
t1 12
t1 11
t1 10
t1 9
t1 8
t1 7
t1 6
t1 5
t1 4
t1 3
t1 2
t1 1
t1 0
mutex test
stdthread(6)并发mutex相关推荐
- python多进程并发接口_python-并发编程之多进程
一.操作系统基础: 进程的概念起源于操作系统,操作系统其它所有概念都是围绕进程来的,所以我们了解进程之前先来了解一下操作系统 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统 ...
- Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)
1. 竞态条件 一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况.这种情况也被称为竞态条件(race condition),这往往会破坏共享数据的一致性. 举个例子,同时有多个线程连续向同一 ...
- Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]
本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...
- C++11 并发指南三(std::mutex 详解)
上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...
- stdthread(7)并发unique_lock灵活性
1. 可以在声明后的任意位置调用, 可以缩小锁的作用范围,提供更高的并发度 #include <iostream> #include <mutex> #include < ...
- 线程互斥与同步 在c#中用mutex类实现线程的互斥_Golang 并发编程与同步原语
5.1 同步原语与锁 · 浅谈 Go 语言实现原理draveness.me 当提到并发编程.多线程编程时,我们往往都离不开『锁』这一概念,Go 语言作为一个原生支持用户态进程 Goroutine 的 ...
- 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore
"线程同步"的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行"线程同步(t ...
- Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现
文章目录 互斥锁 Mutex 拷贝使用 Mutex 的问题 读写锁 RWMutex 条件变量 Cond 等待组 WaitGroup 仅执行一次 Once 原子操作 其他 上一篇 <原生并发 go ...
- Go 并发编程Mutex(二)--源码
文章目录 1. 初版的互斥锁 2. 给新人机会 3. 多给些机会 4. 解决饥饿 5. 饥饿模式和正常模式 6. 总结 一讲我们一起体验了 Mutex 的使用,竟是那么简单,只有简简单单两个方法,Lo ...
最新文章
- 编程术语_伟大的编程术语烘烤
- 什么是稀疏矩阵算法?
- 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例
- map:根据 value 找 key ?
- 网页编程从入门到精通 杨凡_学习计划丨西门子S7200编程从入门到精通
- Redis快速入门:安装、配置和操作
- SAP UI5 System Test 的工具之一:uiveri5
- 万事开头难 - 介绍IMX6ULL启动方式
- Spring Boot-springbootHelloword(一)
- 【心情】最近实在是太忙了,没有心情写东西!
- 数据结构之树的应用:并查集
- hive mysql 字符集_Hive字符编码
- Java多线程实现多客户端的通信
- 【送书福利】第一次送书活动(总共10本)
- 鼠标移动 改变Datagrid行的背景颜色
- 如何用js实现数组倒序输出
- Google Analytics API V4(谷歌统计实战)
- MIT Mini Cheetah--仿真流程
- poi tl 判断空值_使用poi-tl操作word模板
- 【考研政治笔记】唯物论中物质观与意识观辨析
热门文章
- 03.native方法(JNI)
- SelectionKey中定义的4种事件
- 关于 form表单 嵌套问题的解决方案
- html的li浮动之后往下移动,多个li浮动后居中显示问题
- oracle vm concat指定分隔符,重写Oracle的wm_concat函数,自定义分隔符、排序
- 数据中心机房的监控系统是否重要?
- mro python_用python实现MRO算法
- vbsedit无法创建空文档_如何用Python快速优雅的批量修改Word文档样式?
- 成功解决ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C h
- Py之pixellib:pixellib库的简介、安装、经典案例之详细攻略