Могут ли потоки использовать один и тот же клиентский сокет? - PullRequest
7 голосов
/ 10 декабря 2010

Я использую TClientSocket или TIdTCPClient indy (в зависимости от проекта)

У меня есть несколько потоков для обработки каждого элемента, и иногда мне нужно отправлять данные через подключенный клиентский сокет.(Чтение данных из сокета НЕ используется в потоках обработки)

В основном мой вопрос ...

  • Возможно ли это?
  • это "безопасно"?

или я должен

  • иметь клиентский сокет на поток или
  • своего рода маршаллинг/ критические секции

delphi-7 indy-9

1 Ответ

4 голосов
/ 10 декабря 2010

Несколько потоков могут читать и записывать в один сокет.Поскольку каждый раз, когда вы accept, он должен извлечь первое соединение из очереди ожидающих соединений, создать новый сокет с такими же свойствами сокета и выделить новый дескриптор файла для этого сокета.

Таким образом, только один поток напринятое соединение.

Если вы спрашиваете, можете ли вы выполнять многократную запись / чтение для принятого соединения, вам потребуются функции блокировки, что приведет к потере преимуществ параллелизма.Если вы хотите выполнить длинный процесс и записать результат в сокет, используйте синхронизацию для записи в правильном порядке.

...