Атомная блокировка нескольких файлов - PullRequest
1 голос
/ 07 августа 2010

Каков наилучший способ атомарной блокировки нескольких файлов?Одна возможность, о которой я подумал, - это простой .lock файл в каталоге (я защищен только от других экземпляров моей программы; я не обязательно пытаюсь помешать другим программам игнорировать блокировку.) Однако все, что я узнал о безопасности потоков, кричит "плохая идея!"Будет ли это безопасный путь?Пытается создать атомарный файл, поэтому, если мне удастся создать его, я знаю, что у меня есть блокировка?Как мне поступить об этом?

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

Ответы [ 5 ]

1 голос
/ 04 октября 2010

Откройте каждый файл исключительно, если вы найдете файл, который не может быть открыт, разблокируйте файлы, которые вы уже заблокировали.Всегда блокируйте в алфавитном порядке, чтобы избежать тупиков.

    private List<FileStream> OpenExclusive(List<string> filenames)
    {
        var streams = new List<FileStream>(filenames.Count);

        try
        {
            filenames.Sort();
            foreach (var name in filenames)
            {
                streams.Add(File.Open(name, 
                  FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None));
            }
            return streams;
        }
        catch (Exception)
        {
            CloseAll(streams);
            return null;
        }
    }

    private void CloseAll(List<FileStream> streams)
    {
        if (streams == null) return;
        foreach (var stream in streams)
        {
            stream.Close();
        }
    }
0 голосов
/ 04 октября 2010

Я хочу, чтобы несколько пользователей отправляли сообщения об ошибках из разных мест в сети.

Используйте ядро ​​базы данных.

Возможно, вы правы, но тогдаМне интересно, как работает SVN.Мне кажется, что нет серверов, все клиенты просто получают доступ к стандартной структуре файлов в вашем каталоге SVN.

http://www.pushok.com/soft_svn_vscvs.php говорит, что SVN основан на BerkleyDB .

0 голосов
/ 07 августа 2010

Если вы откроете файл для монопольного доступа, он останется заблокированным, так что любой, кто попытается открыть его, потерпит неудачу.

0 голосов
/ 07 августа 2010

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

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

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

0 голосов
/ 07 августа 2010

Я рекомендую Mutex, именованный мьютекс - это операционная система в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...