C API сокета ориентировано на многопотоковое исполнение? [дубликат]

Этот вопрос уже имеет ответ здесь:

Я использую и Linux и API сокета Win32. В моей программе несколько потоков совместно используют дескриптор сокета. В частности, несколько вызовов потоков send с общим дескриптором сокета (т.е. тот же порт). В этом случае я должен поместить блокировку для потокобезопасности? Я был неспособен найти ответ. Я могу сделать тест, но хотеть услышать Ваши события.

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

Этот вопрос может быть применим к fprintf функция также. Я задаюсь вопросом, такие системные API имели бы свои собственные блокировки. По моему опыту, вызов fprintf от нескольких потоков не закрыл мою программу, хотя были гонки на файле или stdout (т.е. непоследовательные или непредсказуемые выводы, но программа не была разрушена), который подразумевал fprintf имел блокировку для защиты их внутренней структуры данных.

14
задан minjang 1 March 2010 в 08:08
поделиться

2 ответа

Сокеты не являются частью стандарта C ++, поэтому это зависит от реализации. Обычно они не являются потокобезопасными, поскольку send не является атомарной операцией. Посетите это обсуждение для получения дополнительной информации.

РЕДАКТИРОВАТЬ: ОС могла иметь или не могла иметь внутреннюю блокировку для защиты внутренних структур. Это зависит от реализации. Так что рассчитывать на это не стоит.

10
ответ дан 1 December 2019 в 14:43
поделиться

Отправка данных через сокет не является атомарной транзакцией - любая неатомарная транзакция потребует блокировки / синхронизации. Это не зависит от платформы.

0
ответ дан 1 December 2019 в 14:43
поделиться