【问题标题】:Does a socket shutdown call from another thread always make blocking recv() threads wake up?来自另一个线程的套接字关闭调用是否总是使阻塞的 recv() 线程唤醒?
【发布时间】:2012-06-11 17:04:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: windows linux sockets freebsd


    【解决方案1】:

    我认为你不能依赖它。 shutdown() 初始化套接字关闭,但细节取决于特定情况。某些协议可能确实会立即关闭连接和套接字,这会唤醒在该套接字上休眠的进程。在其他情况下,关闭只是启动协议状态机,但它需要一些时间才能达到唤醒任何人有意义的地步。例如,已建立的 TCP 连接必须经过几个状态转换,直到达到 CLOSED 状态。你最终会醒来,但你不能指望它马上发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      相关资源
      最近更新 更多