Этот вопрос уже имеет ответ здесь:
Я использую и Linux и API сокета Win32. В моей программе несколько потоков совместно используют дескриптор сокета. В частности, несколько вызовов потоков send
с общим дескриптором сокета (т.е. тот же порт). В этом случае я должен поместить блокировку для потокобезопасности? Я был неспособен найти ответ. Я могу сделать тест, но хотеть услышать Ваши события.
Править: Я знаю, что такие данные отправки через сокет не являются атомарной операцией вообще. Определенно мы должны использовать взаимное исключение для потокобезопасности. Однако я задавался вопросом, мог ли системный API иметь их собственную внутреннюю блокировку. Если так, мы можем опустить помещать нашу собственную блокировку.
Этот вопрос может быть применим к fprintf
функция также. Я задаюсь вопросом, такие системные API имели бы свои собственные блокировки. По моему опыту, вызов fprintf
от нескольких потоков не закрыл мою программу, хотя были гонки на файле или stdout (т.е. непоследовательные или непредсказуемые выводы, но программа не была разрушена), который подразумевал fprintf
имел блокировку для защиты их внутренней структуры данных.
Сокеты не являются частью стандарта C ++, поэтому это зависит от реализации. Обычно они не являются потокобезопасными, поскольку send
не является атомарной операцией. Посетите это обсуждение для получения дополнительной информации.
РЕДАКТИРОВАТЬ: ОС могла иметь или не могла иметь внутреннюю блокировку для защиты внутренних структур. Это зависит от реализации. Так что рассчитывать на это не стоит.
Отправка данных через сокет не является атомарной транзакцией - любая неатомарная транзакция потребует блокировки / синхронизации. Это не зависит от платформы.