同步与异步、阻塞跟非阻塞


前言

本人在学习APUE中,对同步跟异步、阻塞跟非阻塞一直搞不清楚,复习时翻看以前做的笔记加网上的资料,终于搞懂了,在此记录并希望能帮助有需要的同学。


一、什么是同步,什么是异步?

首先,同步和异步关注的是消息通信机制,是两个线程之间的关系

例如:
如果线程A对线程B发起请求,A要一直到等B的有效结果返回了才能继续往下运行,**A和B就是同步关系。**如果线程A对线程B发起请求之后,不在原地等结果,直接干别的事情去了,等B有结果了再通知A,A和B的关系就是异步关系。

我们举个形象的例子:

周六,你去小林家找他去你新发现的一个沙池玩泥沙。但是很不巧的是,小林正在写作业,他妈妈要求写完作业才能出去玩。
此时,你就有两种选择:

同步的方式:你留在小林家等他完成作业,然后你们两一起去玩泥沙。

异步的方式:****你先去沙池玩,等小林完成作业后,他打电话给你,说他写完作业啦,叫你去他家接他去沙池玩(因为小林不知道新的沙池在哪)。

这就是异步跟同步的区别啦!!!不知道我有没讲明白。
总的来说,同步跟异步就是指两个人在第一次邀请时,两人有没有一起去目的地,一起去目的地了呢就是同步,要是邀请人他自己一个人先去目的地,被邀请的人忙完事再通知邀请人来接他一起去呢,这就是异步啦。

下面我们来看看阻塞跟非阻塞吧!

二、什么是阻塞,什么是非阻塞?

首先,阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态,是单个线程的状态。

例如:
如果线程A对线程B发起请求,A线程要B线程的返回值(可以是表示无结果的返回值,ERROR,例如select),A在等的过程中不干别的,线程挂起,休眠,就是阻塞状态;如果A线程不用等B的结果,直接干别的去了,那么就是非阻塞状态

我们举个形象的例子:
我们平时去奶茶店买奶茶,在我们点完奶茶并付款后,服务员便会给我们一个领奶茶的小票对不对?

那咱也有两种选择啦:

阻塞:你看下四周人不多,感觉很快就能拿到奶茶。我们坐在奶茶店的椅子上等待服务员喊我们奶茶的号码,等拿到奶茶我们才走。

**非阻塞:**你看了下四周,有好多人都在等待奶茶,感觉要等好久才能拿到奶茶。于是我们决定想先去隔壁看看漂亮衣服,过几分钟再回来问问我们的奶茶做好了没。如果服务员说没做好,那么我们又回去看衣服,要是做好了我们就取走。


三、 同步跟异步、阻塞跟非阻塞的区别:

同步和异步关注的是消息通信机制,是两个线程之间的关系
阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态,是单个线程的状态。

异步中,一个线程会主动通知另一个线程,数据准备完成。
就像你小林同学会打电话告诉你,他完成作业了,让你去接他。
非阻塞中,没有线程会通知非阻塞线程数据准备完成,需要阻塞线程自己去询问。就像奶茶店的服务员不会打电话告诉你奶茶做好了。

同步跟阻塞虽然都是等待,但是他们等待得我结果是不一样的。
同步等待结果并跟另一个线程一起。你等小林做完作业,然后一起去玩。(等待的是小林做完作业这个消息,别人做完作业的消息无效,我们不用理会)
阻塞仅是等待一个返回值。等奶茶时,不一定刚好就叫到你奶茶的号码,当叫到别人奶茶的号码时,你也需要做出反应,这不是我的奶茶。(等待奶茶时,会有许多别人的奶茶号码,你也要做出判断是不是你的奶茶号,需要做出反应)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值