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