2010-05-31 6 views
3

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

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

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

+0

Это, возможно, должно иметь тег, указывающий платформу (например, Posix), поскольку ни сокеты, ни потоки являются частью стандартного C++. Сокет может быть представлен дескриптором, специфичным для потока, который не может быть действительным образом использован в других потоках. Это по умолчанию используется в SymbianOS. Что не является правильным C++, но нет ничего, чтобы остановить реализацию сокетов BSD-стиля в чем-то, что является правильным C++, от того же самого. –

ответ

4

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

0

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

Sockets & Нити несколько золотое правило ...

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