Гарантии атомарности на Winsocks?

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

2 ответа

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

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

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

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

Другие вопросы по тегам