2015-11-19 3 views
3

Огляделся, но не смог найти ссылку, оправдывающую ответ для сокетов AF_UNIX.Разъем AF_UNIX отправляет поток в безопасном режиме?

Моя реализация в системе Linux, у меня есть AF_UNIX SOCK_STREAM сокет,

  • один приемник нить на этом сокете
  • несколько рабочих потоков, которые могут позвонить «отправить()» на этом сокете.

Мой вопрос: Есть AF_UNIX socket 'send()' thread safe? Если у меня есть параллельные друг с другом потоки/одновременное вызов send на сокете AF_UNIX fd, ядро ​​позаботится о синхронизации?

Я прошел через несколько ссылок, но все они связаны с сокетами TCP/UDP (AF_INET), поэтому, если кто-нибудь может предложить ссылку, которая оправдывает ответ, или может дать некоторое представление о коде ядра, это было бы большая помощь.

+0

Это не имеет ничего общего с темами. – curiousguy

ответ

5

POSIX specifies что все функции, которые он определяет, должны быть потокобезопасными, за исключением тех, которые указаны в списке конкретных исключений. Функция send(2) определена POSIX и не включена в список исключений. Поскольку реализация Linux send(2) предназначена для соответствия спецификациям POSIX, вы можете полагаться на нее, чтобы быть потокобезопасной.

+2

Насколько я знаю, «Linux» не является «совместимой с POSIX системой». –

+1

@Rhymoid, 'send()' является syscall, а его реализация Linux в документе документирована в соответствии с POSIX. Я уточнил свой ответ, чтобы быть более точным в этом отношении. –

+0

Да, но что означает «потокобезопасность»? – curiousguy

1

В целом операции, такие как чтение или запись, являются атомарными. Но на трубах или розетках все по-другому.

Для труб, POSIX, но я подозреваю, что Linux, чтобы быть совместимым с этой точки, утверждает, что параллельные записи гарантированно не будут перемежаться только если длина меньше PIPE_BUF. См. POSIX write.

Для розеток, Linux руководство для send функций семьи говорит:

Когда сообщение не помещается в буфер отправки сокета, посыла() обычно блокирует, если сокет не был помещен в неблокирующий режим ввода-вывода.

Это говорит о том, что ядро, вероятно send S вашего сообщения на куски, так же, как с трубой семантической.

На эту информацию по данному вопросу предоставляется Is send atomic?.

Смежные вопросы