前言
本人在学习APUE中,对同步跟异步、阻塞跟非阻塞一直搞不清楚,复习时翻看以前做的笔记加网上的资料,终于搞懂了,在此记录并希望能帮助有需要的同学。
一、什么是同步,什么是异步?
首先,同步和异步关注的是消息通信机制,是两个线程之间的关系。
例如:
如果线程A对线程B发起请求,A要一直到等B的有效结果返回了才能继续往下运行,**A和B就是同步关系。**如果线程A对线程B发起请求之后,不在原地等结果,直接干别的事情去了,等B有结果了再通知A,A和B的关系就是异步关系。
我们举个形象的例子:
周六,你去小林家找他去你新发现的一个沙池玩泥沙。但是很不巧的是,小林正在写作业,他妈妈要求写完作业才能出去玩。
此时,你就有两种选择:
同步的方式:你留在小林家等他完成作业,然后你们两一起去玩泥沙。
异步的方式:****你先去沙池玩,等小林完成作业后,他打电话给你,说他写完作业啦,叫你去他家接他去沙池玩(因为小林不知道新的沙池在哪)。
这就是异步跟同步的区别啦!!!不知道我有没讲明白。
总的来说,同步跟异步就是指两个人在第一次邀请时,两人有没有一起去目的地,一起去目的地了呢就是同步,要是邀请人他自己一个人先去目的地,被邀请的人忙完事再通知邀请人来接他一起去呢,这就是异步啦。
下面我们来看看阻塞跟非阻塞吧!
二、什么是阻塞,什么是非阻塞?
首先,阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态,是单个线程的状态。
例如:
如果线程A对线程B发起请求,A线程要等B线程的返回值(可以是表示无结果的返回值,ERROR,例如select),A在等的过程中不干别的,线程挂起,休眠,就是阻塞状态;如果A线程不用等B的结果,直接干别的去了,那么就是非阻塞状态。
我们举个形象的例子:
我们平时去奶茶店买奶茶,在我们点完奶茶并付款后,服务员便会给我们一个领奶茶的小票对不对?
那咱也有两种选择啦:
阻塞:你看下四周人不多,感觉很快就能拿到奶茶。我们坐在奶茶店的椅子上等待服务员喊我们奶茶的号码,等拿到奶茶我们才走。
**非阻塞:**你看了下四周,有好多人都在等待奶茶,感觉要等好久才能拿到奶茶。于是我们决定想先去隔壁看看漂亮衣服,过几分钟再回来问问我们的奶茶做好了没。如果服务员说没做好,那么我们又回去看衣服,要是做好了我们就取走。
三、 同步跟异步、阻塞跟非阻塞的区别:
同步和异步关注的是消息通信机制,是两个线程之间的关系。
阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态,是单个线程的状态。
异步中,一个线程会主动通知另一个线程,数据准备完成。
就像你小林同学会打电话告诉你,他完成作业了,让你去接他。
非阻塞中,没有线程会通知非阻塞线程数据准备完成,需要阻塞线程自己去询问。就像奶茶店的服务员不会打电话告诉你奶茶做好了。
同步跟阻塞虽然都是等待,但是他们等待得我结果是不一样的。
同步等待结果并跟另一个线程一起。你等小林做完作业,然后一起去玩。(等待的是小林做完作业这个消息,别人做完作业的消息无效,我们不用理会)
阻塞仅是等待一个返回值。等奶茶时,不一定刚好就叫到你奶茶的号码,当叫到别人奶茶的号码时,你也需要做出反应,这不是我的奶茶。(等待奶茶时,会有许多别人的奶茶号码,你也要做出判断是不是你的奶茶号,需要做出反应)