私が揮発性について読んだことはすべて、決して安全ではないと言っていますが、それでも試してみたいと思っています.この特定のシナリオが安全でないと宣言されたのを見たことはありません.
メインのシミュレーション スレッドからデータを取得して、シーンをレンダリングする別のスレッドがあります。これには同期がなく、正常に動作します。
問題は、プログラムが終了したときに、レンダラーが無効なメモリを読み取ろうとすることなく、シミュレーション スレッドが安全にクリーンアップできるようになる前に、レンダラーがシミュレーション スレッドからのデータのプルを停止する必要があることです。
これを実現するために、レンダラーをそのスレッドで無限に実行します。
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 を stillRendering に追加すると、これまでテストしたたびに、アプリケーションが正常に終了しました。「programRunning」が揮発性である場合に問題がないように見える理由はわかりません。
最後に、「stillRendering」に volatile を使用することで、プログラムのパフォーマンスがどのように影響を受けるかはわかりません。stillRendering を volatile にすることが OnQuit() のパフォーマンスに影響するかどうかは問題ではありませんが、RenderThreadFunction() のパフォーマンスに影響するかどうかは問題です