透彻理解程序中的互斥与同步

在程序猿中,有很多同学不太理解互斥与同步的概念,就像不理解阻塞与非阻塞的概念一样。互斥和同步是我们编写一个中大型项目中必不可少的概念,如果你不知道或者没用过,说明你需要继续多学习和实践,很多linux 应用程序中的问题都是由于同步和互斥导致的,并且这类问题一旦遇到还比较难查,有时候还会是偶现的问题,今天就和大家一起来透彻的理解这一概念,

互斥

首先我先说一个栗子,盘子中有五个苹果,小明和小兰同时从盘子中去除两个,那小明和小兰在哪苹果的那个时刻,盘子中还有几个?
同样,我们在操作一个全局变量的时候,如果两个线程中的函数都去操作这个变量,那这个变量的值还确定吗?
我们编写程序的时候,程序逻辑和某一个时刻的数值是确定的。这样我们才能让程序正常的执行下去,加入发生不确定性,那么程序肯定会出问题。特别是再写一些固定逻辑的问题的程序的时候。所以这个时候就需要我们用到这个概念互斥,互斥的意思就是不能同时操作,要有先后,操作的这一时刻也是是临界区,只允许顺序执行,串行操作,或者说原子操作
我们如何来达到这一效果呢,可以通过互斥锁,通过信号量等方式,具体的操作都和简单,大概都是三个步骤就可以达到这一效果。初始化,加锁,解锁

同步

互斥其实还是挺好理解的,但是如何理解在程序中的同步呢?
同步表面是理解就是同时来做某件事情,由于最早我们的计算机是单核的,所以我们无法真正的去同时去做某一件事情,我们处理任务的时候都是采用的分时的操作,就是你执行一段时间,我执行一段时间,这样也是很接近同一时刻了。但是我们为什么要用到同步的操作啊,原因是A B两个操作,是需要结果依赖的,而A B两个操作者都同时执行,那么势必会造成不知道谁先执行,同样也会出现第一个例子中的结果。小明和小兰同时想去树上摘苹果,但是小明拿着梯子,他们同时摘可以,但是一定要小明把梯子放上,才能达到同时摘的效果,所以同时摘的话,就需要同步梯子放到树下这一时刻,否则小兰摘的是0,但是系统却不知道,不一定恰当,单就是这个道理。
所以要达到同步的效果,一定要知道两个同时运行的程序之间存在的先后顺序,然后使用VP操作控制,来达到这样的效果。使用方法为信号量。

实例-生产者 消费者问题

https://blog.csdn.net/weixin_44075132/article/details/116494462
这篇文章写的也不错
https://blog.csdn.net/weixin_44075132/article/details/116503739

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值