繁体   English   中英

来自另一个线程的套接字关闭调用是否总是使阻塞的recv()线程唤醒?

[英]Does a socket shutdown call from another thread always make blocking recv() threads wake up?

我找不到太多文档说明这种情况是否应该发生:

  1. 某个线程打开一个TCP(或其他流)套接字
  2. 线程1启动一个阻塞的recv()
  3. 线程2使用SHUT_RDWR(或我认为的SHUT_RD)在套接字上调用shutdown()
  4. 现在,线程1已从其阻塞调用中“唤醒”,并返回零,就像另一方关闭其套接字一样。

此行为出现在现代Linux和FreeBSD系统上。 我没有和其他人一起测试过。

在此处对Microsoft MSDN帮助页面的评论: http : //msdn.microsoft.com/zh-cn/library/windows/desktop/ms740481%28v=vs.85%29.aspx表明,此行为是“负责任的”视窗; 它还指出这不是“当前情况”,但可能已过时。

是否在任何地方指定了此行为? 我可以依靠吗?

我认为您不能依靠它。 shutdown()初始化套接字关闭,但是详细信息取决于特定的情况。 某些协议确实可能立即关闭连接和套接字,这将唤醒在该套接字上休眠的进程。 在其他情况下,关机只是使协议状态机起作用,但是要花点时间才能唤醒任何人。 例如,已建立的TCP连接必须转换为几个状态,直到达到CLOSED状态。 您最终将醒来,但是您不能依靠它立即发生。

暂无
暂无

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

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