Взаимное исключение, не затрагивая оба процесса

У меня есть уникальная проблема. Два процесса (P0 и P1) пытаются получить доступ к одному файлу. P0 записывает информацию в файл, а P1 читает информацию. Между двумя существует состояние гонки, в котором P1 читает, прежде чем P0 закончит запись. Я рассмотрел возможность использования Locks, Semaphores и т. Д. Однако P1 существует в наборе кода, который мне запрещено изменять каким-либо образом, и в настоящее время он не имеет реализации для поддержки предложенных выше исправлений.

Есть ли способ удалить это состояние гонки, не касаясь обоих наборов кода?

2 ответа

Решение

Вы можете разрешить записи P0 в файл A и разрешить чтение P1 из файла B. Когда P0 завершит запись файла, переименуйте файл A в файл B. Хотя вы должны убедиться, что операция переименования является атомарной.

Решение Нильса великолепно, но может быть неприменимо, если это большой файл с небольшими дельтами. Я собираюсь предположить, что ваше решение будет зависеть от:
а) блокирует ли файл P1, и вы просто хотите избавиться от конфликта,
b) нужно ли вам убедиться, что то, что читает P1, всегда является обновленной копией с изменениями P0, и
c) соблюдает ли P1 блокировку чтения для рассматриваемого файла.

Кроме того, ищите системные системные вызовы O/S, чтобы увидеть, можете ли вы отслеживать поведение P1 изнутри P0 для координации процессов. Например, для Windows класс.NET System.Diagnostics.Process может содержать несколько полезных методов.

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