2010-05-03 4 views
1

Поскольку Windows не предоставляет сокеты домена UNIX, я использую локальное TCP-соединение для имитации поведения. Теперь POSIX гарантирует, что если несколько потоков записываются в сокет UNIX параллельно, куски до PIPE_BUF будут обрабатываться атомарно - то есть никакого чередования не произойдет. Есть ли аналогичная гарантия на локальном TCP-сервере winsock или мне нужно синхронизировать авторов, используя критический раздел?Гарантии Atomicity на Winsocks?

+0

Я думал, что Windows предоставила почтовые ящики как то же, что и локальные сокеты Unix. И назвали трубы. –

+0

Проблема с именованными каналами заключается в том, что AFAIK вы не можете выбрать() их. – sustrik

ответ

0

Его явно не гарантировано. Замок. Незаконные замки дешевы, если вы не находитесь в чрезвычайно плотной петле. Если вы действительно не хотите этого делать, используйте перекрывающиеся входы/выходы.

+0

Как здесь можно использовать перекрывающуюся помощь ввода-вывода? Если он имеет несколько потоков, пишущих в один и тот же сокет, тогда различные независимые записи будут чередоваться, если он не блокирует ... –

+0

Hm, actaully, используя локальный UDP, может помочь получить поведение ... – sustrik

+0

Но я предполагаю, что нет никакой гарантии, что UDP-пакеты получат через стек локальной сети. – sustrik

1

Если у вас есть несколько потоков, пишущих в один и тот же сокет, тогда каждый вызов записи будет атомарным, но каждый будет чередоваться относительно других вызовов записи, которые происходят в разных потоках;

Итак, если у вас есть нить 1, в которой написана строка A в одной записи и потоке 2, набирая серию B с одной записью и серию C с другой, вы можете получить ABC, или BAC или BCA, но вы wont получить сломанный прогон A с некоторыми B в середине ...

Если вам требуется, чтобы две записи, которые выдаются потоком 2, не чередуются с записью, которая выдается потоком 1 (то есть ABC и BCA прекрасны, но BAC - нет), тогда вы должны либо использовать один вызов для WSASend() в потоке 2 с двумя буферами в массиве структур WSABUF (разметка/сборка), либо вам нужно блокировать вызовы записи, чтобы поток 1 не может прерываться.

+0

Отлично. Я имел в виду первое. Является ли поведение документированным где-то? – sustrik

+0

Не так, хотя я писал перекрывающиеся серверы ввода-вывода, используя это предположение уже более 10 лет, и это всегда поведение, которое я видел; вы можете принять это: «WSASend не следует вызывать в одном и том же сокете одновременно из разных потоков, потому что это может привести к непредсказуемому порядку буфера». отсюда: http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx как указание на то, что сами буферы не разделены; но это расплывчато ... –