Se considera incorrecto el valor de bool volátil para el control de subproceso

Como resultado de mi respuesta aesta pregunt, Comencé a leer sobre la palabra clavevolatile y cuál es el consenso al respecto. Veo que hay mucha información al respecto, algunas viejas que ahora parecen estar mal y muchas nuevas que dicen que casi no tiene lugar en la programación de subprocesos múltiples. Por lo tanto, me gustaría aclarar un uso específico (no pude encontrar una respuesta exacta aquí en SO).

También quiero señalar que entiendo los requisitos para escribir código multihilo en general y por quévolatile no está resolviendo cosas. Aún así, veo código usandovolatile para el control de subprocesos en las bases de código en las que trabajo. Además, este es el único caso en que uso elvolatile palabra clave ya que todos los demás recursos compartidos están sincronizados correctamente.

Di que tenemos una clase como:

class SomeWorker
{
public:
    SomeWorker() : isRunning_(false) {}
    void start() { isRunning_ = true; /* spawns thread and calls run */ }
    void stop() { isRunning_ = false; }

private:
    void run()
    {
        while (isRunning_)
        {
            // do something
        }
    }
    volatile bool isRunning_;
};

Por simplicidad, algunas cosas se omiten, pero lo esencial es que se crea un objeto que hace algo en un hilo recién generado comprobando un volatile) booleano para saber si debería detenerse. Este valor booleano se establece desde otro subproceso cada vez que desea que el trabajador se detenga.

Mi entendimiento ha sido que la razón para usarvolatile en este caso específico es simplemente para evitar cualquier optimización que lo almacene en caché en un registro para el bucle. Por lo tanto, resulta en un bucle infinito. No hay necesidad de sincronizar correctamente las cosas, porque el subproceso de trabajo eventualmente obtendrá el nuevo valor

Me gustaría entender si esto se considera completamente incorrecto y si el enfoque correcto es usar una variable sincronizada. ¿Hay alguna diferencia entre compilador / arquitectura / núcleos? ¿Quizás es solo un enfoque descuidado que vale la pena evitar?

Sería feliz si alguien aclarara esto. ¡Gracias

EDITA

Me interesaría ver (en código) cómo decide resolver esto.

Respuestas a la pregunta(5)

Su respuesta a la pregunta