Мне нравится случайное представление информации. Есть еще лучшая статья Херба Саттера, но я не смог найти ссылку. Суть не в том, чтобы бросать из деструктора, а в конструктор, если вам нужно сообщить о неудачном завершении создания, и обязательно с ним справиться.

я есть ситуация, когда 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;

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

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос