Для UDP, если два потока одновременно записываются в дескриптор сокета, оба сообщения будут отправляться как отдельные датаграммы. Может произойти фрагментация IP, если пакет больше MTU, но результирующие дейтаграммы будут сохранены и правильно собраны приемником. Другими словами, вы безопасны для UDP, за исключением обычных проблем, связанных с UDP (переупорядочение датаграммы, потеря пакетов и т. Д.).
Для TCP, который основан на потоке, я не знаю. Ваш вопрос по существу задает эквивалент «если два потока пытаются записать в один и тот же дескриптор файла, будет ли файл по-прежнему читаться?» На самом деле я не знаю ответа.
Простейшая вещь, которую вы можете сделать, это просто использовать безопасную блокировку потока (mutex) для защиты вызовов отправки и записи в сокет, чтобы только поток мог записывать в сокет за раз.
Для TCP я предлагаю иметь выделенный поток для обработки всех сокетов io. Затем просто придумайте способ, с помощью которого сообщения от рабочих прерываний могут быть асинхронно поставлены в очередь на поток сокета для его отправки. Точка сокета также может обрабатывать вызовы recv() и уведомлять другие потоки, когда соединение сокета завершается удаленной стороной.
Я пишу в сокет из двух разных процессов, и вы столкнулись с моей проблемой: избегайте передачи сообщений между процессами (как это было бы необходимо, если бы у меня была одна запись процесс), когда гораздо предпочтительнее просто отправлять их через сокет. Я мог бы синхронизировать запись с помощью семафора, но я предпочитаю избегать проблем, если ядро все равно это сделает (это вопрос моего вопроса). – lvella
Я столкнулся с этим ответом, пытаясь выяснить, является ли sendto() над UDP потокобезопасным. Так это так? Если это так, здорово! – fluffy