Извикването за изключване на сокет от друга нишка винаги ли кара блокиращите recv() нишки да се събуждат?

Не мога да намеря много документация, за да кажа дали това трябва да се случи или не:

  1. Някои нишки отварят TCP (или друг поток) сокет
  2. Нишка 1 стартира блокиращ recv()
  3. Нишка 2 извиква shutdown() на сокета с SHUT_RDWR (или SHUT_RD мисля)
  4. Нишка 1 вече е "събудена" от блокиращото си повикване и връща нула, както би направила, ако другата страна затвори своя сокет.

Това поведение се появява на съвременни Linux и FreeBSD системи. Не съм го тествал с други.

Коментар за помощна страница на Microsoft MSDN тук: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740481%28v=vs.85%29.aspx предполага, че това поведение е "отговорно" в Windows; също така се посочва, че това „в момента не е така“, но това може да е остаряло.

Посочено ли е някъде това поведение? Мога ли да разчитам на него?


person MarkR    schedule 07.06.2012    source източник


Отговори (1)


Не мисля, че можете да разчитате на това. shutdown() инициира изключване на сокет, но подробностите зависят от конкретни обстоятелства. Някои протоколи може наистина да затворят връзката и сокета незабавно, което би събудило процесите, спящи на този сокет. В други случаи изключването просто пуска машината за състояние на протокола в действие, но ще отнеме известно време, докато стигне до точката, в която ще има смисъл да събудите всеки. Например установената TCP връзка ще трябва да премине през няколко състояния, докато достигне състояние ЗАТВОРЕНО. В крайна сметка ще се събудите, но не можете да разчитате, че това ще се случи веднага.

person ArtemB    schedule 26.06.2013