拿一个比较简单的例子来说一下同步、异步、阻塞与非阻塞是什么样子的
阻塞/同步:比如说你去食堂吃面,你叫好了面,在窗口一直等着面来(好比说怕被人取走),一直等到面来了为止。
非阻塞:你叫好了面,你每隔五分钟到窗口看一下面有没有好,没好就离开坐一会。
异步:你选择直接用手机外卖app叫了一碗面,下单以后干你自己的事去了。
稍微比较学术一点解释是这样
同步
同步是在发出一个功能调用之后,没有出现结果之前,这个调用就不会返回。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。
异步
与同步相反的是,当一个异步的过程调用发出后,不能立即获得结果,通过状态信息来回调通知调用者。以CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。
在同步与异步比较需要注意的是通信机制,就是调用者对于调用结果的的处理。
阻塞
阻塞调用与同步有点相似,实质是在调用结果返回之前,当前线程会被挂起,函数得到结果才会返回。
与同步的不同点,在于当同步的调用发出时,它的线程还是处于激活的状态,只是从逻辑上函数是没有返回的。区别主要在于线程在等待函数调用结果时的状态。
非阻塞
非阻塞是在函数调用发出后,不能立即得到结果,就会马上返回,而不是进入阻塞状态。
所以说在阻塞与非阻塞需要重点考虑的是程序在等待调用结果的状态转化情况。