Linux线程同步(互斥量、信号量、条件变量、生产消费者模型) 为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间变量,模拟寄存器工作方式,后面会详解) 第一次执行结果
第二次执行结果
第三次执行结果
一段代码执行三次出现不同的结果,这是为什么?就是因为两个线程同时对共享资源进行操作,导致CPU处理共享资源出现错误 寄存器处理数据+1操作一般分为三步从内存读变量值到寄存器寄存器的值加1将寄存器的值写回内存 假设变量值为5那么CPU执行线程A,将变量读到寄存器中,寄存器的值+1(正在加,此时值还为5),同时线程B将变量从内存中读走(值也为5),线程A将寄存器值写回变量(此时值为6),之后线程B处理完写回变量(此时值还是为6)
那么怎么解决这种情况发生? 一、互斥量 互斥量是pthread_mutex_t类型的变量。互斥量有两种状态:lock(上锁)、unlock(解锁)当对一个互斥量加锁后,其他任何试图访问互斥量的线程都会被堵塞,直到当前线程释放互斥锁上的锁。如果释放互斥量上的锁后,有多个堵塞线程,这些线程只能按一定的顺序得到互斥量的访问权限,完成对共享资源的访问后,要对互斥量进行解锁,否则其他线程将一直处于阻塞状态。 简单理解为:超市中的储存柜,当有人使用储存柜后,其他人使用不了,只能等待使用者使用完,再使用 互斥量操作原理 创建锁可以通过直接定义锁,或者调用初始化锁函数,二选一 对之前的例子加上互斥量 不管怎么执行,结果都是10000次
死锁的情况 同一个线程已拥有A锁的情况下,再次请求A锁,导致线程阻塞解决方法:使用完资源后立刻解锁线程一拥有A锁,再次请求B锁,同时线程二拥有B锁,请求A锁,导致线程阻塞解决方法:当拥有锁的情况下,请求另外一把锁失败时,释放已拥有的锁 c/c++Linux服务器开发高阶知识点视频学习资料的朋友加qun
二、条件变量 条件变量就是一个变量,用来自动阻塞一个线程,直到某特殊情况发生为止。条件变量是用来等待事件通常条件下变量和互斥锁同时使用。 条件变量操作原语 生产者消费模型 流程首先消费者需要访问共享资源首先要去拿到锁访问条件变量,条件变量说现在还没有资源,所以消费者释放锁,阻塞等待,直到生产者生产出资源后,将资源先放到公共区后,再告诉条件变量,现在有资源了,然后条件变量再去唤醒阻塞线程,这些阻塞的线程被唤醒后需要去争抢锁,先拿到锁的线程优先访问共享资源
实例 运行结果
三、信号量 信号量分为有名信号量和无名信号量,这里主要介绍无名信号量,用于线程同步,有名信号量一般是用于进程之间管理。信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问,也被称为PV原子操作P操作,即信号量sem减一的过程,如果sem小于等于0,P操作被堵塞,直到sem变量大于0为止。P操作及加锁过程。V操作,即信号量sem加一的过程。V操作及解锁过程。 简单理解:假设现在有五把钥匙,当有人拿走一把后(P操作),就剩4把钥匙,直到钥匙被拿完,后面的人需要等待,直到使用者将钥匙归还(V操作) 信号量操作原理 信号量的生产消费者模型 运行结果
原文链接:Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)_赵小厨的博客-CSDN博客_互斥量条件变量信号量
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/23246.html