2012-06-07 2 views
2

나는이는 일이되어 여부 말 많은 문서를 찾을 수 없습니다다른 스레드의 소켓 종료 호출은 항상 blocking recv() 스레드가 깨어나게합니까?

  1. 일부 스레드가 TCP (또는 다른 스트림) 스레드 1이 차단 recv를 시작
  2. 소켓을 엽니 다()
  3. 스레드 2는 SHUT_RDWR (또는 생각해 보면 SHUT_RD)을 사용하여 소켓에서 shutdown()을 호출합니다.
  4. 스레드 1은 현재 블로킹 호출에서 "깨어났다"고하고 상대방이 소켓을 닫으면 0을 반환합니다.

이 동작은 최신 Linux 및 FreeBSD 시스템에 나타납니다. 나는 다른 사람들과 그것을 테스트하지 않았다.

여기에 Microsoft MSDN 도움말 페이지에 대한 의견 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspx은 Windows에서이 동작이 "책임"이라고 제안합니다. 그것은 또한 이것이 현재의 경우는 아니지만 이것은 시대에 뒤 떨어진 것일 수 있다고 말합니다.

어디서나이 동작이 지정됩니까? 나는 그것에 의지 할 수 있습니까?

답변

1

나는 당신이 그것에 의지 할 수 있다고 생각하지 않습니다. shutdown()은 소켓 종료를 시작하지만 세부 사항은 특정 상황에 따라 다릅니다. 일부 프로토콜은 실제로 연결 및 소켓을 즉시 닫아서 해당 소켓에서 잠자고있는 프로세스를 깨울 수 있습니다. 다른 경우에는 shutdown으로 프로토콜 상태 머신을 작동 시키지만 누군가를 깨우는 것이 의미가있을 때까지는 약간의 시간이 걸립니다. 예를 들어, 확립 된 TCP 연결은 CLOSED 상태에 도달 할 때까지 몇 가지 상태로 전환해야합니다. 당신은 결국 깨울 것입니다, 그러나 당신은 그것에 바로 일어나기를 의지 할 수 없습니다.

관련 문제