forma adecuada de usar archivos de bloqueo como bloqueos entre múltiples procesos

Tengo una situación en la que 2 procesos diferentes (el mío C ++, otro realizado por otras personas en JAVA) son un escritor y un lector de algún archivo de datos compartido. Así que estaba tratando de evitar la condición de carrera escribiendo una clase como esta (EDITAR: este código está roto, era solo un ejemplo)

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;

Esto es para un programa ofc, otro tendrá una clase análoga. La idea es: 1. verificar si otro programa creó su archivo "Soy el propietario", si tiene un descanso, vaya a 2. 2. crear mi archivo "Soy el propietario", verifique nuevamente si otro programa creó el suyo, si ha eliminado mi archivo y se ha roto, vaya a 3. 3. lea, luego elimine el mío "Soy el archivo propietario".

Tenga en cuenta que las ocurrencias raras cuando ambos no leen ni escriben están bien, pero el problema es que todavía veo una pequeña posibilidad de condiciones de carrera porque, en teoría, otro programa puede verificar la existencia de mi archivo de bloqueo, ver que no hay uno, luego creo el mío, otro programa crea el suyo, pero antes de que FS cree su archivo, verifico nuevamente, y no está allí, entonces ocurre un desastre. Es por eso que agregué el retraso de un segundo, pero como un nerd de CS me resulta desconcertante tener un código como ese ejecutándose. Ofc No espero que nadie aquí me escriba una solución, pero sería feliz si alguien conoce un enlace a unde confianz código que puedo usar. PD Tiene que ser archivos, porque no estoy escribiendo todo el proyecto y así es como está organizado para hacerse.

P.P.S .: el acceso al archivo de datos no es lector, escritor, lector, escritor ... puede ser lector, lector, escritor, escritor, escritor, lector, escritor ...

P.P.S: otro proceso no está escrito en C ++ :(, por lo que el impulso está fuera de discusión.

Respuestas a la pregunta(3)

Su respuesta a la pregunta