linux操作系统之线程同步及互斥量
(1)线程同步
1)线程同步:指一个线程发出某一个功能运行时,在运行还没有结束的时候,该调用不返回。同时其它线程为保证数据的一致性,不能调用该功能。
2)多个控制流共同操作一个共享资源的时候,都需要同步。
3)数据混乱的原因:1》资源共享 2》调度随机 3》线程间缺乏必要的同步机制。
前两点无法避免,只能从第三点开始优化。
(2)互斥量mutex
1)linux中提供一把互斥锁mutex(互斥量),每个线程都是提前对资源操作前都尝试先加锁,成功加锁才能操作,操作结束后解锁。
2)同一个时刻,只能有一个线程持有该锁。
3)当线程A多某个全局变量加锁访问时,B在访问时尝试加锁,失败后,B阻塞。C线程不加锁访问全局变量,可以访问,但是数据混乱,因此互斥锁又被成为“建议锁”(协同锁),没有强制限定。
(3)互斥量及相关函数:
pthread_mutex_t类型,一个结构体,使用时可看做整数。函数成功返回0,失败返回错误号。
1)pthread_mutex_intit:初始化一个互斥锁(互斥量) -->初值可看作1
int pthread_mutex_init(pthread_mutex_t*restrict mutex,const pthread_mutexattr_t*restrict attr);
参数1;传出参数,待初始化的互斥量。
参数2:看成互斥量属性,出入参数,通常传NULL,表示默认属性(线程间共享)
静态初始化: 使用宏初始化 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
动态初始化:使用函数初始化。
2)pthread_mutex_destory:销毁一个互斥锁
int pthread_nutex_destory(pthread_mutex_t *mutex);
3)pthread_mutex_lock:加锁
尝试加锁,加锁不成功,则阻塞。
int pthread_nutex_lock(pthread_mutex_t *mutex);
4)pthread_mutex_unlock:解锁
唤醒阻塞所有线程。
int pthread_nutex_unlock(pthread_mutex_t *mutex);
5)pthread_mutex_trylock:尝试加锁
加锁失败后返回错误号,不阻塞。
int pthread_nutex_trylock(pthread_mutex_t *mutex);
(4)加锁解锁测试:不同线程实现不同的打印任务
结论:在访问共享资源时加锁,访问结束后解锁,锁的“粒度”越小越好
(5)死锁
1)同一个线程试图多同一个互斥量加锁两次。
2)线程1拥有A锁请求B锁;线程2拥有B锁请求A锁。
linux操作系统之线程同步及互斥量相关推荐
- 信号灯文件锁linux线程,linux——线程同步(互斥量、条件变量、信号灯、文件锁)...
一.说明 linux的线程同步涉及: 1.互斥量 2.条件变量 3.信号灯 4.文件读写锁 信号灯很多时候被称为信号量,但个人仍觉得叫做信号灯比较好,因为可以与"SYSTEM V IPC的信 ...
- 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发
多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...
- 线程同步之互斥量(互斥锁)
1 同步的概念 所谓同步, 即同时起步,协调一致.不同的对象, 对"同步" 的理解方式略有不同. 如,设备同步,是指在两个设备之间规定一个共同的时间参考: 数据库同步, 是指让两个 ...
- 1线程同步:互斥量,死锁
1线程为什么要同步 A:共享资源,多个线程都可对共享资源操作. B:线程操作共享资源的先后顺序不确定. C:处理器对存储器的操作一般不是原子操作. 2互斥量 mutex操作原语 pthread_ ...
- 线程同步之互斥量加锁解锁 死锁
与互斥锁相关API 互斥量(mutex)从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁.对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程将会被阻 ...
- RTT的线程同步篇——互斥量
野火RTT第20章互斥量 2018年12月29日 10:47 互斥量不能在中断服务程序中使用. 互斥量是特殊的二值信号量,其"特殊"在哪呢?互斥量不同于二值信号量的地方在于:互斥量 ...
- Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...
- linux线程同步(1)-互斥量
一.概述 互斥量是线程同步的一种机制,用来保护多线程的共享资源.同一时刻,只允许一个线程对临界区进行 ...
- 线程同步之——互斥量及死锁问题
互斥量:多个线程同时访问共享数据时可能会冲突,这跟信号的可重性是同样的问题.如 果两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 1. 从内存读变量值到寄存器 2. 寄存器的值加 ...
最新文章
- ASP.NET之对称算法加密
- websocket java 测试_Java后端WebSocket的Tomcat实现
- Centos7 单台服务器搭建Elasticsearch6.0.1集群
- 【Linux系统编程】Linux线程浅析
- JDK 动态代理和MyBatis 用到的JDK 动态代理有什么区别?
- Processing 字体变形
- 局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究
- python实例编程_python 编程实例 5
- java 命令行读取_Java:从控制台(console,命令行)读取字符 | 学步园
- python 姓名用*替换_学会用python截取你的姓名
- 如何用阿里云服务器建立一个wordpress网站
- Python 多进程multiprocessing
- ddrelease64 黑苹果_有老哥会看黑苹果哆嗦模式问题出在哪里的吗?
- 学习(一)C#利用窗体打开Excel文件进行正常访问和写入
- 软件工程实践2017——软件产品案例分析
- 无栈非递归中序遍历非线索化二叉树
- Windows畸形文件夹
- 大数据HBase在阿里搜索中的应用实践
- R语言——read.table函数
- wikioi-天梯-进入省队-并查集-1073:家族
热门文章
- 读书印记 - 《沟通的艺术:一本手把手教你社交沟通的书》
- 搭建springboot环境
- (转)rvm安装与常用命令
- Java-- 异常与记录日志
- 如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票
- 介绍针对企业级Flex开发的开源项目FlexibleShare
- 水晶报表的统计功能-Crystal Report Sub total Per Page
- linux用户操作的日志,linux 用户操作记录并录入日志
- python 东哥 with open_python 连接redis cluster
- python中的文件父路径怎么表达_python中的文件父路径怎么表达_如何在Python中访问父目录...