правильный способ использования файла (ов) блокировки в качестве блокировки между несколькими процессами

У меня есть ситуация, когда 2 разных процесса (мой C ++, другие выполняются другими людьми в JAVA) являются писателем и читателем из некоторого общего файла данных. . Итак, я пытался избежать состояния гонки, написав такой класс (РЕДАКТИРОВАТЬ: этот код не работает, это был просто пример)

class ReadStatus
{
    bool canRead;
public:
    ReadStatus()
    {
        if (filesystem::exists(noReadFileName))
        {
            canRead = false;
            return;
        }
        ofstream noWriteFile;
        noWriteFile.open (noWriteFileName.c_str());
        if ( ! noWriteFile.is_open())
        {
            canRead = false;
            return;
        }
        boost::this_thread::sleep(boost::posix_time::seconds(1));
        if (filesystem::exists(noReadFileName))
        {
            filesystem::remove(noWriteFileName);
            canRead= false;
            return;
        }
        canRead= true;
    }
    ~ReadStatus()
    {
        if (filesystem::exists(noWriteFileName))
            filesystem::remove(noWriteFileName);
    }
    inline bool OKToRead()
    {
        return canRead;
    }
};

использование:

ReadStatus readStatus; //RAII FTW
    if ( ! readStatus.OKToRead())
        return;

Это для одной программы ofc, другая будет иметь аналогичный класс. Идея такая: 1. проверьте, создала ли другая программа его «Файл Я - владелец», если где-то есть пауза, перейдите к 2. 2. Создайте мой файл «Я владелец», проверьте еще раз, создала ли другая программа свой собственный, удалила ли она мой файл и сломала, иначе перейдите к 3. 3. прочтите, а затем удалите мой файл «Я являюсь владельцем файла».

Обратите внимание, что редкие случаи, когда они оба не читают и не пишут, допустимы, но проблема в том, что я все еще вижу небольшую вероятность состояния гонки потому что теоретически другая программа может проверить наличие моего файла блокировки, увидеть, что его нет, затем я создаю свой, другая программа создает свой собственный, но до того, как FS создаст свой файл, я проверяю снова, и его нет, тогда происходит катастрофа. Вот почему я добавил задержку в одну секунду, но, как ботаник по CS, я считаю, что запуск такого кода нервирует. Конечно, я не ожидаю, что здесь кто-нибудь напишет мне решение, но я был бы счастлив, если бы кто-нибудь знал ссылку на надежный код, который я мог бы использовать. P.S. Это должны быть файлы, потому что я не пишу весь проект, и именно так он устроен.

PPS: доступ к файлу данных - это не читатель, писатель, читатель, писатель .... он может быть читателем, читателем, писателем, писателем, писателем, читателем, писателем ....

PPS: другой процесс не написан на C ++ :(,так что о повышении не может быть и речи.

5
задан NoSenseEtAl 20 September 2011 в 13:01
поделиться