Поскольку Windows не предоставляет сокеты домена UNIX, я использую локальное TCP-соединение для имитации поведения. Теперь POSIX гарантирует, что если несколько потоков записываются в сокет UNIX параллельно, куски до PIPE_BUF будут обрабатываться атомарно - то есть никакого чередования не произойдет. Есть ли аналогичная гарантия на локальном TCP-сервере winsock или мне нужно синхронизировать авторов, используя критический раздел?Гарантии Atomicity на Winsocks?
ответ
Его явно не гарантировано. Замок. Незаконные замки дешевы, если вы не находитесь в чрезвычайно плотной петле. Если вы действительно не хотите этого делать, используйте перекрывающиеся входы/выходы.
Как здесь можно использовать перекрывающуюся помощь ввода-вывода? Если он имеет несколько потоков, пишущих в один и тот же сокет, тогда различные независимые записи будут чередоваться, если он не блокирует ... –
Hm, actaully, используя локальный UDP, может помочь получить поведение ... – sustrik
Но я предполагаю, что нет никакой гарантии, что UDP-пакеты получат через стек локальной сети. – sustrik
Если у вас есть несколько потоков, пишущих в один и тот же сокет, тогда каждый вызов записи будет атомарным, но каждый будет чередоваться относительно других вызовов записи, которые происходят в разных потоках;
Итак, если у вас есть нить 1, в которой написана строка A в одной записи и потоке 2, набирая серию B с одной записью и серию C с другой, вы можете получить ABC, или BAC или BCA, но вы wont получить сломанный прогон A с некоторыми B в середине ...
Если вам требуется, чтобы две записи, которые выдаются потоком 2, не чередуются с записью, которая выдается потоком 1 (то есть ABC и BCA прекрасны, но BAC - нет), тогда вы должны либо использовать один вызов для WSASend()
в потоке 2 с двумя буферами в массиве структур WSABUF (разметка/сборка), либо вам нужно блокировать вызовы записи, чтобы поток 1 не может прерываться.
Отлично. Я имел в виду первое. Является ли поведение документированным где-то? – sustrik
Не так, хотя я писал перекрывающиеся серверы ввода-вывода, используя это предположение уже более 10 лет, и это всегда поведение, которое я видел; вы можете принять это: «WSASend не следует вызывать в одном и том же сокете одновременно из разных потоков, потому что это может привести к непредсказуемому порядку буфера». отсюда: http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx как указание на то, что сами буферы не разделены; но это расплывчато ... –
Я думал, что Windows предоставила почтовые ящики как то же, что и локальные сокеты Unix. И назвали трубы. –
Проблема с именованными каналами заключается в том, что AFAIK вы не можете выбрать() их. – sustrik