同步/异步-阻塞/非阻塞


(A)同步和异步,是针对 调用结果是如何返回给调用者来说的,即调用的结果是调用者主动去获取的(比如一直等待recvfrom或者设置超时等待select),则为同步,而调用结果是被调用者在完成之后通知调用者的,则为异步(比如windows的IOCP)。
(B)阻塞和非阻塞,是针对调用者所在线程是否在调用之后主动挂起来说的,即如果在线程中调用者发出调用之后,再被调用这返回之前,该线程主动挂起,则为阻塞,若线程不主动挂起,而继续向下执行,则为非阻塞。

这样,在网络IO中,同步异步,阻塞非阻塞,就可以形成2x2 = 4种情况 ,但由于 异步肯定是非阻塞的,所以有三种情况
(1)同步阻塞: 调用者发出某调用之后(比如调用了read函数),如果函数不能立即返回,则挂起所在线程,等待结果;
(2)同步非阻塞:调用者发出调用之后(比如read),如果当时有数据可读,则读取并返回,如果没有数据可读,则线程继续向下执行。在实际使用时,read调用会在一个循环中,这样就可以不断的读取数据(尽管可能某次read操作并不能获得任何数据);
(3)异步非阻塞:调用者发出调用之后(如async_recv),线程继续进行别的操作,被调用的读操作由系统(或者库)来进行,等待有结果之后,系统(或者库)通过某种机制(一般为调用调用者设置的回调函数)来通知调用者。
原文地址:https://www.cnblogs.com/gtarcoder/p/5588978.html