Ну, я был не прав.
Итак, они делят компенсацию, но происходит еще кое-что странное. Если бы они не делили смещение, вы бы получили вывод, который выглядел так:
this is a long long output from chredt
потому что каждый начинает писать со своим смещением 0 и продвигать символ за раз. Они не начнут конфликтовать о том, что записать в файл, пока не дойдут до последнего слова предложения, которое в конечном итоге будет чередоваться.
Итак, они делят смещение.
Но странно то, что смещение не обновляется атомарно, поскольку ни один из процессов не отображается полностью. Это похоже на то, что некоторые части одного перезаписывают некоторые части другого, хотя они также увеличивают смещение, так что это всегда не происходит.
Если бы смещение не передавалось, вы бы получили столько же байтов в файле, сколько и самой длинной из двух строк.
Если смещения используются совместно и обновляются атомарно, в результате получается, что в файле будет ровно столько байтов, сколько объединены обе строки.
Но в результате вы получите несколько байтов в файле, который находится где-то посередине, и это подразумевает, что смещения используются совместно, а не обновляются атомарно, и это просто странно. Но это, видимо, то, что происходит. Как странно.
- процесс A считывает смещение в A.offset
- процесс B считывает смещение в B.offset
- процесс A записывает байт в A.offset
- процесс A устанавливает смещение = A.offset + 1
- процесс B записывает байт в B.offset
- процесс A считывает смещение в A.offset
- процесс B устанавливает смещение = B.offset + 1
- процесс A записывает байт в A.offset
- процесс A устанавливает смещение = A.offset + 1
- процесс B считывает смещение в B.offset
- процесс B записывает байт в B.offset
- процесс B устанавливает смещение = B.offset + 1
Примерно такова должна быть последовательность событий. Как очень странно.
Существуют системные вызовы pread и pwrite, поэтому два процесса могут обновить файл в определенной позиции, не гоняясь за тем, кто оценивает глобальные смещения.