Мне нравится случайное представление информации. Есть еще лучшая статья Херба Саттера, но я не смог найти ссылку. Суть не в том, чтобы бросать из деструктора, а в конструктор, если вам нужно сообщить о неудачном завершении создания, и обязательно с ним справиться.
я есть ситуация, когда 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 ++ :(, так что повышение не может быть и речи.