繁体   English   中英

阻塞和非阻塞读取有什么区别?

[英]What is the difference between a blocking and non-blocking read?

将等待/无等待指示符的概念添加到上述问题中作为TCP / IP或UDP环境中的ReadMessage函数的参数。

第三方功能描述指出:

此函数用于从队列中读取消息,该队列由先前的registerforinput调用定义。 输入等待/无等待指示符将确定此函数是否将阻止指定的队列,等待数据放在队列中。 如果指定了nowait选项且没有可用数据,则会将NULL指针返回给调用者。 当可用数据时,此函数将返回指向从队列读取的数据的指针。

函数阻塞或非阻塞是什么意思?

阻止意味着您的代码(在该线程中)的执行将在调用期间停止。 实质上,在阻塞操作完成之前,函数调用不会返回。

阻塞读取将等待,直到有可用数据(或超时,如果有的话,到期),然后从函数调用返回。 非阻塞读取将(或至少应该)立即返回,但如果当前没有数据,则可能不会返回任何数据。

比喻如果你允许我 - 对不起,已经是下午很晚了,我心情很好,如果它被投票决定 - 啊......

你想进入一个时髦的夜总会,但保镖告诉你,在有人出来之前你不能进去。 在这种情况下你被有效地“阻止”了。 当有人出来时,你可以自由进入 - 或者出现一些错误状况,例如“那些训练师吗?” 在你进入之前,你的夜晚并没有真正开始,你的享受被“阻挡”了。

在“非阻塞”场景中,您将告知保镖您的电话号码,并且当有空闲插槽时他会给您回电。 所以现在你可以在等待别人出来的时候做点别的事,你可以在其他地方开始你的夜晚,然后在被叫的时候回来继续......

对不起,如果这没有帮助...

看看这个: http//www.scottklement.com/rpg/socktut/nonblocking.html

以下是一些摘录:

  • '默认情况下,TCP套接字处于“阻塞”模式。 例如,当您调用recv()从流中读取时,控件不会返回到您的程序,直到从远程站点读取至少一个字节的数据。 等待数据出现的这个过程称为“阻塞”。

  • '可以设置描述符,使其处于“非阻塞”模式。 当处于非阻塞模式时,您永远不会等待操作完成。 如果您需要在许多不同的连接套接字之间切换,并且希望确保它们都不会导致程序“锁定”,这是一个非常宝贵的工具。

此外,尝试首先搜索答案通常是一个好主意(只需在搜索引擎中键入“阻止与非阻塞读取”),然后一旦你碰到那里的墙就会问你不能问的问题。找到答案。 我上面分享的链接是第二个搜索结果。 在互联网论坛上提问之前,先看一下这篇关于该怎么做的精彩文章: http//www.catb.org/~esr/faqs/smart-questions.html#before

在您的情况下,这意味着在实际返回消息之前,函数不会返回。 它会阻止你的程序继续前进,但是当它向前推进时你会有一个消息可以使用。

如果指定nowait ,如果队列中没有消息,则会立即返回空指针,这允许您处理该情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM