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

时间:2011-03-10 17:05:15

标签: c++ multithreading blocking nonblocking

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

第三方功能描述指出:

  

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

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

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

以下是一些摘录:

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

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

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

答案 2 :(得分:3)

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

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

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

很抱歉,如果这没有帮助......

答案 3 :(得分:0)

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

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