Гнездо в несколько потоков - PullRequest
3 голосов
/ 31 мая 2010

У меня есть проект, в котором поток A вызывает Accept (...) для какого-либо сокета, затем передает его другому потоку, который получает этот сокет, а затем закрывает сокет.

Объект, для которого был вызван метод accept, никогда не закрывается в потоке A. Это безопасно?

Что происходит с этим объектом в потоке A?

Ответы [ 2 ]

4 голосов
/ 31 мая 2010

Сокет - это не объект - это просто число (или, возможно, указатель). Если вы передаете целое число из одного потока в другой, проблем не возникает - то же самое с сокетами. Предполагается, что вы спрашиваете о сокетах уровня ОС, а не о каком-либо классе сокетов, который реализовали вы или используемая вами среда, и что вы получаете доступ к сокету только из одного из потоков, что, по-видимому, имеет место.

0 голосов
/ 31 мая 2010

Да, он закроется. Но это не гарантирует, что неиспользуемый сокет будет немедленно доступен для сборки мусора (ссылка в ThreadA)

Розетки и нитки, несколько золотых правил ...

  • Сокетные объекты небезопасны, убедитесь, что для доступа к этому ресурсу используется какая-то блокировка / мьютекс (подумайте о синхронизации)
  • Доступ к сокету (как и любой другой ввод / вывод) является операцией блокировки, это может создать ОЧЕНЬ много конфликтов (и потратить много циклов ЦП) в случае многопоточного доступа
  • ВСЕГДА явно закрывайте сокеты (сервер или клиент), просто чтобы быть уверенным в двойстве и не удивлять себя lrr
  • если вы постоянно собираетесь читать данные из сокета, а другие потоки будут использовать эти данные, ИСПОЛЬЗУЙТЕ потокобезопасную структуру данных (параллельную очередь), которую могут использовать другие потоки. поэтому один поток просто читает данные из сокета и делает их доступными в очереди, откуда другие потоки могут работать с данными
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...