У меня есть ситуация, когда 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 ++ :(,так что о повышении не может быть и речи.