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相关推荐

  1. python多进程并发接口_python-并发编程之多进程

    一.操作系统基础: 进程的概念起源于操作系统,操作系统其它所有概念都是围绕进程来的,所以我们了解进程之前先来了解一下操作系统 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统 ...

  2. Go 学习笔记(66)— Go 并发同步原语(sync.Mutex、sync.RWMutex、sync.Once)

    1. 竞态条件 一旦数据被多个线程共享,那么就很可能会产生争用和冲突的情况.这种情况也被称为竞态条件(race condition),这往往会破坏共享数据的一致性. 举个例子,同时有多个线程连续向同一 ...

  3. Go 学习笔记(23)— 并发(02)[竞争,锁资源,原子函数sync/atomic、互斥锁sync.Mutex]

    本文参考 <Go 语言实战> 1. 竞争状态简述 如果两个或者多个 goroutine 在没有互相同步的情况下,访问某个共享的资源,并试图同时读和写这个资源,就处于相互竞争的状态,这种情况 ...

  4. C++11 并发指南三(std::mutex 详解)

    上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...

  5. stdthread(7)并发unique_lock灵活性

    1. 可以在声明后的任意位置调用, 可以缩小锁的作用范围,提供更高的并发度 #include <iostream> #include <mutex> #include < ...

  6. 线程互斥与同步 在c#中用mutex类实现线程的互斥_Golang 并发编程与同步原语

    5.1 同步原语与锁 · 浅谈 Go 语言实现原理​draveness.me 当提到并发编程.多线程编程时,我们往往都离不开『锁』这一概念,Go 语言作为一个原生支持用户态进程 Goroutine 的 ...

  7. 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

    "线程同步"的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行"线程同步(t ...

  8. Golang 基础:底层并发原语 Mutex RWMutex Cond WaitGroup Once等使用和基本实现

    文章目录 互斥锁 Mutex 拷贝使用 Mutex 的问题 读写锁 RWMutex 条件变量 Cond 等待组 WaitGroup 仅执行一次 Once 原子操作 其他 上一篇 <原生并发 go ...

  9. Go 并发编程Mutex(二)--源码

    文章目录 1. 初版的互斥锁 2. 给新人机会 3. 多给些机会 4. 解决饥饿 5. 饥饿模式和正常模式 6. 总结 一讲我们一起体验了 Mutex 的使用,竟是那么简单,只有简简单单两个方法,Lo ...

最新文章

  1. 编程术语_伟大的编程术语烘烤
  2. 什么是稀疏矩阵算法?
  3. 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例
  4. map:根据 value 找 key ?
  5. 网页编程从入门到精通 杨凡_学习计划丨西门子S7200编程从入门到精通
  6. Redis快速入门:安装、配置和操作
  7. SAP UI5 System Test 的工具之一:uiveri5
  8. 万事开头难 - 介绍IMX6ULL启动方式
  9. Spring Boot-springbootHelloword(一)
  10. 【心情】最近实在是太忙了,没有心情写东西!
  11. 数据结构之树的应用:并查集
  12. hive mysql 字符集_Hive字符编码
  13. Java多线程实现多客户端的通信
  14. 【送书福利】第一次送书活动(总共10本)
  15. 鼠标移动 改变Datagrid行的背景颜色
  16. 如何用js实现数组倒序输出
  17. Google Analytics API V4(谷歌统计实战)
  18. MIT Mini Cheetah--仿真流程
  19. poi tl 判断空值_使用poi-tl操作word模板
  20. 【考研政治笔记】唯物论中物质观与意识观辨析

热门文章

  1. 03.native方法(JNI)
  2. SelectionKey中定义的4种事件
  3. 关于 form表单 嵌套问题的解决方案
  4. html的li浮动之后往下移动,多个li浮动后居中显示问题
  5. oracle vm concat指定分隔符,重写Oracle的wm_concat函数,自定义分隔符、排序
  6. 数据中心机房的监控系统是否重要?
  7. mro python_用python实现MRO算法
  8. vbsedit无法创建空文档_如何用Python快速优雅的批量修改Word文档样式?
  9. 成功解决ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C h
  10. Py之pixellib:pixellib库的简介、安装、经典案例之详细攻略