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

8
将上述问题的概念添加到TCP/IP或UDP环境中的ReadMessage函数的等待/非等待指示器参数中。第三方函数描述如下:
该函数用于从先前由registerforinput调用定义的队列中读取消息。输入等待/非等待指示器将确定此函数是否会在指定的队列上阻塞,等待数据放置在队列上。如果指定了nowait选项并且没有可用数据,则会向调用者返回空指针。当有数据可用时,该函数将返回从队列中读取的数据的指针。
什么是阻塞或非阻塞函数的含义?
4个回答

11

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

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


我正在一个我创建的线程中,只有在有数据可用时才想从队列中读取,否则当没有数据时,我希望处理器检查其他线程(例如我创建此线程的主线程)。 - user553514
3
“block” 的意思是此线程被阻塞,但其他线程仍可以被调度执行。请注意,在此线程阻塞时,其他线程仍会继续执行。 - Steve Jessop
@SteveJessop:感谢您澄清被阻止的人是谁。这是我主要的困惑点。 - user553514

6
如果你允许我打个比方——抱歉,现在已经是下午晚些时候了,我有点情绪化,如果这篇翻译被踩的话——好吧...

你想去一个时髦的夜店,但保安告诉你必须等到有人出来才能进去。你实际上是在这个条件下“被阻塞”了。当有人出来时,你就可以自由进入——或者出现一些错误条件,比如“你穿的是运动鞋吗?” 直到你进入夜店,你的夜晚才真正开始,你的享受被“阻塞”了。

在“非阻塞”场景中,你可以告诉保安你的电话号码,他会在有空位时给你打电话。所以现在你可以在等待别人出来的同时做其他事情,你可以在其他地方开始你的夜晚,并在被叫回来后继续在那里......

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


@Downvoter..好的,我的比喻有什么问题吗?OP确实问了什么是“阻塞”和“非阻塞”... - Nim
5
对于“阻塞”场景,如果俱乐部已经满员了,保安会阻拦你离开;你别无选择,只有等待。对于“非阻塞”场景,你可以询问保安是否还有位置,如果有空位,你就可以离开,希望稍后再回来,但成功入场需要在出现空位的时刻到达。而“异步I/O”场景是你把电话号码留给保安的情况。 - supercat

4
看看这个:http://www.scottklement.com/rpg/socktut/nonblocking.html 以下是其中的一些摘录:
- "默认情况下,TCP套接字处于“阻塞”模式。例如,当您调用recv()从流中读取时,只有在从远程站点读取至少一个字节的数据后,控制才会返回到您的程序。等待数据出现的过程称为“阻塞”。" - "可以将描述符设置为“非阻塞”模式。在非阻塞模式下,您永远不必等待操作完成。如果您需要在许多不同的连接套接字之间切换,并希望确保没有一个套接字导致程序“锁定”,则这是一种非常有价值的工具。"
此外,通常最好先尝试搜索答案(只需在搜索引擎中键入“阻塞与非阻塞读取”),然后在遇到难题时再来提问您找不到答案的问题。我分享的链接是第二个搜索结果。查看这篇关于在互联网论坛上提问前该做什么的好文章:http://www.catb.org/~esr/faqs/smart-questions.html#before

我现在在我创建的一个线程中,我只想在队列中有数据时才从中读取,否则当没有数据时,我希望处理器检查其他线程(例如我从中创建此线程的主线程)。我该使用哪个选项?阻塞或非阻塞选项? - user553514
我确实上过互联网,但不知为何没有找到任何直接相关或有用的东西。Stack Overflow拥有众多卓越的大脑。因此,如果在谷歌搜索中没有成功,我只会在这里提问。感谢您的回复。 - user553514
没关系。无论如何,我希望上面的答案有所帮助。同时,也请看一下我提供的链接文章——它非常值得一读。 - J. Taylor

0
在您的情况下,这意味着函数不会返回直到实际有消息返回。这将防止程序向前移动,但当它确实向前移动时,您将有一条可用的消息。
如果指定了 nowait,则如果队列中没有消息,立即返回空指针,这允许您处理该情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接