¿Es seguro usar un bool volátil para forzar a otro hilo a esperar? (C ++)

Todo lo que he leído sobre volatile dice que nunca es seguro, pero todavía me siento inclinado a intentarlo, y no he visto este escenario específico declarado inseguro.

Tengo un hilo separado que representa una escena y extrae datos del hilo de simulación principal. Esto no tiene sincronización, y funciona bien.

El problema es que cuando el programa sale, el renderizador debe dejar de extraer datos del subproceso de simulación antes de que el subproceso de la simulación pueda limpiarse de forma segura sin que el renderizador intente leer la memoria no válida.

Para lograr esto, tengo el renderizador ejecutado infinitamente en su hilo:

volatile bool stillRendering;

void RenderThreadFunction()
{
    stillRendering = true;

    while(programRunning)
    {
        renderer->render();
    }

    stillRendering = false;
}

En el hilo principal del programa, cuando se recibe el mensaje de salida de windproc, hago:

void OnQuit()
{
    programRunning = false;
    while(stillRendering)
    {
    }

    delete application;
}

El objetivo de esto es asegurarse de que el renderizador deje de extraer datos de la aplicación antes de llamar a eliminar la aplicación.

Primero intenté esto sin ninguna palabra clave volátil, y funcionó en el modo de depuración, pero en el modo de lanzamiento se colgó. Supongo que el compilador realizó una optimización que hace que el programa deje de verificar el valor de stillRendering.

Agregar volatile a solo stillRendering causó que la aplicación saliera exitosamente cada vez que lo probé hasta ahora. No estoy seguro de por qué no parece importar si "programRunning" es volátil.

Por último, no estoy seguro de cómo se verá afectado el rendimiento del programa mediante el uso de volatile para "stillRendering". No me importa si el hecho de stillRendering volatile afecta el rendimiento de OnQuit (), pero sí me importa si afecta el rendimiento de RenderThreadFunction ()

Respuestas a la pregunta(5)

Su respuesta a la pregunta