提问者:小点点

阻塞读取和非阻塞读取之间的区别是什么?


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

第三方功能描述规定:

此函数用于从由先前的registerforinput调用定义的队列中读取消息。 输入的wait/no wait指示器将确定此函数是否会在指定的队列上阻塞,等待将数据放入队列。 如果指定了nowait选项,并且没有可用的数据,则将向调用方返回一个空指针。 当数据可用时,该函数将返回一个指向从队列中读取的数据的指针。

一个函数是阻塞的还是非阻塞的,这意味着什么?


共3个答案

匿名用户

阻塞意味着您的代码(在那个线程中)的执行将在调用的持续时间内停止。 本质上,在阻塞操作完成之前,函数调用不会返回。

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

匿名用户

如果你允许的话,我可以打个比方--对不起,现在已经是下午很晚了,如果投票通过的话,我的心情很好--啊,好吧。。。

你想进入一家时髦的夜总会,但保镖告诉你,除非有人出来,否则你不能进去。 在这种情况下,你实际上被“阻止”了。 当有人出来的时候,你可以自由地进去--或者一些错误条件比如“那些是训练师吗?” 你的夜晚直到你进去才真正开始,你的享受被“阻挡”了。

在一个“非阻塞”的场景中,你会告诉保镖你的电话号码,当有空闲的插槽时,他会给你回电话。 所以现在你可以在等人出来的时候做些别的事情,你可以在别的地方开始你的夜晚,在被叫的时候回来,继续在那里……

抱歉,如果你没帮上忙。。。

匿名用户

请查看以下内容:http://www.scottklement.com/rpg/socktut/nonblocking.html

以下是其中的一些摘录:

>

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

    可以设置一个描述符,使其处于“非阻塞”模式。 当置于非阻塞模式时,您从不等待操作完成。 如果您需要在许多不同的连接套接字之间切换,并且希望确保没有一个套接字导致程序“锁定”,那么这是一个非常有价值的工具。

    另外,通常最好先搜索一个答案(在搜索引擎中键入“blocking vs.non-blocking read”),然后碰壁后再来问一些你找不到答案的问题。 上面我分享的链接是第二个搜索结果。 看看这篇关于在互联网论坛上提问前该做什么的文章吧:http://www.catb.org/~esr/faqs/smart-questions.html#before