简单指出:
阻碍是不允许回来,总是在
等待直到它完成。
非阻塞是你先做。我会看看有没有别的东西在我
发现东西卡住之前立即
报告领导。
让我们以最常用的发送和接收
功能。
例如,你调用Send
函数发送一个字节发送给
系统内所做的
工作是数据
传输(
复制)的TCP / IP协议栈的输出缓冲区,这并不意味着发送数据已经成功
执行成功,如果TCP / IP协议栈没有足够的可用缓冲区来
保存你的数据复制…这次展示的阻塞和非阻塞的
区别:对socket的发送函数阻塞
模式将在系统有足够的
空间来将数据发送回复制过去就缓冲回来,和非阻塞套接字发送wsaewoulddblock告诉打电话的人会立刻说:发送
操作封锁!!!你想
处理……
出于同样的
原因,recv函数的内部工作机制的功能是通知它说:在接收的TCP / IP协议栈缓冲区高,你的数据。对于阻塞模式套接字,如果TCP/IP协议栈的接收缓冲区没有通知结果,则不会返回系统资源。阻止套接字函数的方式非将立即返回,然后告诉你wsaewoulddblock ---:没有数据,坐在后面一看
延伸:
在
网络编程中,我们
经常看到四种
类型的
同步,异步的,阻塞的和非阻塞的,这些都不是很好的理解,下面是我对这些术语的理解。
1。同步
所谓的同步是函数调用时发出,呼叫不到的结果是没有得到回报。根据这一定义,函数中的绝大多数
都是同步调用(如仙,IsDigit,等等),但总的来说,我们说话时,同步和异步,我们指的要求其他地区的合作还是需要一定的时间来完成
任务。最常见的例子是SendMessage。这个函数将
消息发送到一个窗口,而不在其他已完成消息返回。当一方完成处理,函数返回一些值返回的消息处理函数的来电。
2。异步
异步的概念和同步。当一个异步过程调用发送,对方不能立即得到结果。当实际处理这个调用部分完成后,来访者的状态,通知,通知和回调。以casycsocket类为例(注意,CSocket是从CAsyncSocket,但功能已从异步到同步)。当一个客户端发送
连接请求通过调用connect函数,调用者
线程可以
运行下来。当连接真正建立,插座的底部层发送一个消息通知该对象。这里所说的是,执行部件和调用者返回结果有三种:状态、通知和回调哪一个可以用来实现
组件的实现,除非执行部分提供了多种选择,否则不受对方
控制。如果执行部分由政府通知,调用者需要每次在一定的时间
检查。效率很低,如果使用通知,效率很高,因为执行部分几乎不需要额外的操作,至于回调函数,通知和通知之间没有多大差别。
三.梗阻
阻塞调用意味着当前线程挂起之前调用的结果返回,函数只会在得到回报。有人可能会把阻塞同步调用调用,事实上他们是不同的。同步要求,很多时候仍然是
激活当前线程,但目前的功能在逻辑上是不例如,我们叫回来接收功能的CSocket,如果缓冲区中的任何数据,该函数将等待数据返回。在这一点上,当前线程将继续处理各种消息。如果主窗口和调用函数在同一线程的主
界面应该被刷新,除非你把它在一个特殊的界面操作功能。另一个函数,recv,socket接收的数据是一个阻塞调用的一个例子。插座在阻塞模式工作时,如果调用函数时没有数据,当前线程将被挂起直到有数据。
4。非阻塞
非阻塞和阻塞的概念对应于函数不阻塞当前线程并立即返回之前不能立即得到结果的函数。
对象的阻塞模式和阻塞函数调用
对象是否处于阻塞模式和函数是否是阻塞调用具有很强的相关性,但它不是一对一的对应。阻塞对象可以有非阻塞调用。我们可以通过某个API轮询状态,在
正确的时间调用阻塞函数时停止阻塞。对于非阻塞对象,调用特殊函数也可以进入阻塞调用。