Хотя блокировки на основе потоков могут решить эту проблему, существует способ, который работает между потоками, но, вероятно, лучше всего использовать его, когда несколько процессов записывают в конец одного файла .
Чтобы получить такое поведение для процессов (или потоков тоже), укажите, что вы хотите, чтобы атомарные записи добавления в операционную систему создавались при создании дескрипторов файла ОС.Это можно сделать, указав O_APPEND в Posix (Linux, Unix) и FILE_APPEND_DATA в Windows.
В C # вы не называете ОС «open» или системными вызовами «CreateFile» напрямую, но есть способычтобы получить этот результат.
Я спросил, как это сделать под Windows, и получил два хороших ответа здесь: Как я могу сделать атомарную запись / добавление в C #, или как я могу получитьфайлы, открытые с флагом FILE_APPEND_DATA?
По сути, вы можете использовать FileStream () или PInvoke, я бы предложил FileStream () поверх PInvoke по очевидным причинам.
Вы можете использовать аргументы конструкторав FileStream (), чтобы указать асинхронный файловый ввод-вывод в дополнение к флагу FileSystemRights.AppendData, который должен предоставить вам как асинхронный ввод-вывод, так и атомарные записи в файл.
Предупреждение. Некоторые ОС имеют ограничения намаксимальное количество байтов, которое может быть атомарно записано таким образом, и превышение этого порога устранит обещание атомарности ОС.
Из-за этой последней ошибкиЯ бы порекомендовал придерживаться управления конфликтами в стиле lock () при попытке решить вашу проблему в рамках одного процесса.