从另一个线程的套接字closures调用总是使阻塞recv()线程唤醒?

我无法find很多文件来说明这是否应该发生:

  1. 某个线程打开一个TCP(或其他stream)套接字
  2. 线程1开始阻塞recv()
  3. 线程2使用SHUT_RDWR(或SHUT_RD我认为)在套接字上调用shutdown()
  4. 线程1现在被它的阻塞调用“唤醒”,并返回零,就像对方closures其套接字一样。

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

在这里的Microsoft MSDN帮助页面的评论: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspx表明这种行为是“负责任”的视窗; 它也表示这是“目前不是这样”,但这可能已经过时。

这种行为在任何地方指定? 我可以依靠吗?

我不认为你可以依靠它。 shutdown()启动套接字关闭,但具体情况取决于具体情况。 某些协议可能确实会立即关闭连接和套接字,从而唤醒睡眠在该套接字上的进程。 在其他情况下,关机只是启动协议状态机,但要花点时间才能唤醒任何人。 例如,建立的TCP连接将不得不通过少数状态转换,直到达到CLOSED状态。 你最终会醒来,但你不能依靠它马上发生。