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

C++ 阻塞读取和非阻塞读取之间的区别是什么?,c++,multithreading,blocking,nonblocking,C++,Multithreading,Blocking,Nonblocking,除了上述问题之外,还添加了等待/无等待指示器的概念,作为TCP/IP或UDP环境中ReadMessage函数的参数 第三方功能说明指出: 此函数用于从先前registerforinput调用定义的队列中读取消息。输入wait/no wait指示符将确定此函数是否会阻塞指定的队列,等待将数据放入队列。如果指定了nowait选项且没有可用数据,则将向调用方返回空指针。当数据可用时,此函数将返回指向从队列读取的数据的指针 一个函数被阻塞或非阻塞意味着什么?看看这个: 以下是其中的一些摘录: '默认情

除了上述问题之外,还添加了等待/无等待指示器的概念,作为TCP/IP或UDP环境中ReadMessage函数的参数

第三方功能说明指出:

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

一个函数被阻塞或非阻塞意味着什么?

看看这个:

以下是其中的一些摘录:

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

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


此外,通常最好先尝试搜索答案(只需在搜索引擎中键入“阻止阅读与非阻止阅读”),然后在遇到障碍时过来问一些找不到答案的问题。我在上面分享的链接是第二个搜索结果。看看这篇关于在互联网论坛上提问之前该做什么的文章:

阻塞意味着代码(在该线程中)的执行将在通话期间停止。从本质上讲,直到阻塞操作完成,函数调用才会返回


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

如果您允许的话,我可以打个比方-抱歉,现在已经是下午晚些时候了,如果它被否决了,我很有心情-啊

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

在“非阻塞”场景中,你会告诉保镖你的电话号码,当有空位时,他会给你回电话。所以,现在你可以在等待别人出来的时候做些别的事情,你可以在别的地方开始你的夜晚,然后在接到电话后回来,继续在那里度过


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

在您的情况下,这意味着函数将不会返回,直到有消息要返回。它会阻止您的程序向前移动,但当它确实向前移动时,您将有一条消息要处理


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

我在我创建的一个线程内,我只想在数据可用时从队列中读取,否则,当没有数据时,我希望处理器检查其他线程(例如,我创建此线程的主线程)。我用哪一个?阻止还是非阻止选项?我确实上网了,但不知何故,我并没有找到任何直接相关或有用的东西。Stack Overflow拥有大量的优秀人才。所以我在这里只问我在谷歌搜索上是否成功。谢谢你的回复,不用担心。无论如何,我希望上面的答案是有帮助的。看看我链接到的那篇文章,这也是一个很好的阅读。我在我创建的一个线程中,我只想在数据可用时从队列中读取数据,否则当没有数据时,我希望处理器检查其他线程(例如,我创建此线程的主线程)@user553514:“block”这意味着此执行块线程。此线程被阻止时,仍可以安排其他线程。@SteveJessop:感谢您澄清谁被阻止。那是我的主要困惑。。好吧,我的类比怎么了?OP确实问了什么是“阻塞”与“非阻塞”…对于“阻塞”场景,如果俱乐部客满,保镖不会让你离开;除了等待,你别无选择。对于“非阻塞”场景,您可以询问保镖是否有空位,并可以自由离开,希望稍后有空位时再回来,但成功入场需要在空位存在时出现。“异步I/O”场景是将号码留给保镖的场景。