Sicher, flüchtiges Bool zu verwenden, um einen anderen Thread zum Warten zu zwingen? (C ++)

Alles, was ich über volatile gelesen habe, besagt, dass es niemals sicher ist, aber ich bin immer noch geneigt, es zu versuchen, und ich habe nicht gesehen, dass dieses spezielle Szenario für unsicher erklärt wurde.

Ich habe einen separaten Thread, der eine Szene rendert und Daten aus dem Hauptsimulationsthread abruft. Dies hat keine Synchronisation und funktioniert gut.

Das Problem ist, dass der Renderer beim Beenden des Programms keine Daten mehr aus dem Simulationsthread abrufen muss, bevor der Simulationsthread sich sicher bereinigen kann, ohne dass der Renderer versucht, ungültigen Speicher zu lesen.

Um dies zu erreichen, habe ich den Renderer unendlich in seinem Thread ausgeführt:

volatile bool stillRendering;

void RenderThreadFunction()
{
    stillRendering = true;

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

    stillRendering = false;
}

Wenn im Hauptprogramm-Thread die Meldung zum Beenden des Windprozesses empfangen wird, führe ich Folgendes aus:

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

    delete application;
}

Damit soll sichergestellt werden, dass der Renderer keine Daten mehr aus der Anwendung abruft, bevor er delete für die Anwendung aufruft.

Ich habe es zuerst ohne flüchtige Schlüsselwörter versucht und es funktionierte im Debug-Modus, aber im Release-Modus blieb es hängen. Ich gehe davon aus, dass der Compiler einige Optimierungen vorgenommen hat, die dazu führen, dass das Programm den Wert von stillRendering nicht mehr überprüft.

Das Hinzufügen von "volatile" zu "stillRendering" führte dazu, dass die Anwendung jedes Mal erfolgreich beendet wurde, wenn ich sie bisher getestet habe. Ich bin mir nicht sicher, warum es egal zu sein scheint, ob "programRunning" flüchtig ist.

Zuletzt bin ich mir nicht sicher, wie die Leistung des Programms durch die Verwendung von volatile für "stillRendering" beeinflusst wird. Es spielt für mich keine Rolle, ob sich die Leistung von OnQuit () auf die Leistung von RenderThreadFunction () auswirkt, wenn stillRendering volatile ausgeführt wird.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage