aneira imprópria de usar arquivos de bloqueio como bloqueios entre vários process
Tenho uma situação em que 2 processos diferentes (o meu C ++, outro feito por outras pessoas em JAVA) são um escritor e um leitor de algum arquivo de dados compartilhado. Então, eu estava tentando evitar a condição de corrida escrevendo uma classe como esta (EDIT: este código está quebrado, era apenas um exemplo)
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;
}
};
uso
ReadStatus readStatus; //RAII FTW
if ( ! readStatus.OKToRead())
return;
Este é para um programa ofc, outro terá classe análoga. A idéia é: 1. verificar se outro programa criou o arquivo "Eu sou o proprietário", se houver outro problema, vá para 2. 2. crie meu arquivo "eu sou o proprietário", verifique novamente se outro programa criou o seu, se ele excluir o meu arquivo e interromper o procedimento, vá para 3. 3. faça a minha leitura e exclua o meu "Eu sou o arquivo proprietário".
Observe que ocorrências raras quando as duas não lêem ou escrevem são aceitáveis, mas o problema é que ainda vejo uma pequena chance de condições de corrida porque, teoricamente, outro programa pode verificar a existência do meu arquivo de bloqueio, ver que não há um, então eu crio o meu, outro programa cria o seu, mas antes que o FS crie o arquivo, eu verifico novamente, e não está lá, ocorre um desastre. É por isso que adicionei o atraso de um segundo, mas como um nerd de CS, acho irritante ter um código como esse em execução. Ofc Não espero que ninguém aqui me escreva uma solução, mas ficaria feliz se alguém souber um link para umconfiáve código que eu posso usar. P.S. Tem que ser arquivos, porque eu não estou escrevendo um projeto inteiro e é assim que ele está organizado para ser feit
P.P.S .: o acesso ao arquivo de dados não é leitor, escritor, leitor, escritor .... pode ser leitor, leitor, escritor, escritor, escritor, escritor, leitor, escritor ...
P.P.S: outro processo não está escrito em C ++ :(, portanto, o impulso está fora de questão.