我读到的关于 volatile 的所有内容都表明它永远不安全,但我仍然倾向于尝试它,而且我还没有看到这种特定场景被宣布为不安全。
我有一个单独的线程来渲染场景,从主模拟线程中提取数据。这没有同步,并且工作正常。
问题是当程序退出时,渲染器需要停止从模拟线程中提取数据,然后模拟线程才能安全地自行清理,而不会导致渲染器尝试读取无效内存。
为此,我让渲染器在其线程中无限运行:
volatile bool stillRendering;
void RenderThreadFunction()
{
stillRendering = true;
while(programRunning)
{
renderer->render();
}
stillRendering = false;
}
在主程序线程中,当收到 windproc 退出消息时,我会:
void OnQuit()
{
programRunning = false;
while(stillRendering)
{
}
delete application;
}
这样做的目的是确保渲染器在对应用程序调用 delete 之前停止从应用程序中提取数据。
我第一次尝试这个没有任何 volatile 关键字,它在调试模式下工作,但在发布模式下它挂起。我假设编译器做了一些优化,导致程序停止检查 stillRendering 的值。
将 volatile 添加到 just stillRendering 会导致应用程序在我到目前为止每次测试时都成功退出。我不确定为什么“programRunning”是否不稳定似乎并不重要。
最后,我不确定将 volatile 用于“stillRendering”会如何影响程序的性能。使 stillRendering volatile 影响 OnQuit() 的性能对我来说无关紧要,但如果它影响 RenderThreadFunction() 的性能对我来说却很重要