многопоточное написание сокета безопасно без мьютекса - PullRequest
1 голос
/ 10 октября 2019

Я использую сокет, и он будет использоваться в многопоточной среде, где многие потоки будут писать в один и тот же сокет. Синхронизирует ли это сам сокет, или я должен использовать мьютекс?
Будет ли блокироваться один trher, если на него пишет другой?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Совместное использование сокета между потоками без синхронизации безопасно в том смысле, что ваши данные не будут потеряны и не вызовут сбой вашей программы;для отправки пакетов UDP это может быть разумно. Для TCP это часто менее полезно, поскольку порядок данных, передаваемых через поток TCP, не будет четко определен, и, следовательно, получателю будет трудно или невозможно правильно проанализировать получатель.

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

1 голос
/ 10 октября 2019

Для однократной записи это атомарно. Подвох - это упорядочение сообщений (включая чередующиеся сообщения) на принимающей сторонеЕсли это необходимо, то вам нужна блокировка. Если вы не хотите тратить слишком много времени на замок. Вы можете использовать шаблон производителя / потребителя, чтобы уменьшить время блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...