Взаимное исключение, не затрагивая оба процесса - PullRequest
1 голос
/ 30 июля 2010

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

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

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

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

0 голосов
/ 30 июля 2010

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

...