阻塞:
调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
非阻塞:
调用我(函数),我(函数)立即返回通知调用者
以最常用的send和recv两个函数为例
比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..."
对于recv函数,同样道理,对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头再来看看"
同步:
我调用一个功能,该功能没有结束前,我死等结果。
异步:
当一个异步过程调用发出后,调用者不能立刻得到结果。该功能在完成后,通过状态、通知和回调来通知调用者。
同步与阻塞的区别: 阻塞调用是指调用结果返回之前,当前线程会被挂起。对于同步调用来说,虽然调用的函数没有返回,但当前线程还是激活的。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息(同步&非阻塞)。socket接收数据的另外一个函数recv则是一个阻塞调用的例子,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止(同步&阻塞)。