マルチスレッドがあまり得意ではないため、実際の非同期アクセスシナリオについて話すことはできませんが、volatile
修飾子が行うことはコンパイラーに指示することです。
「聞いてください、これはいつでも変わる可能性があるので、キャッシュしたり、レジスターに入れたり、そのようなクレイジーなことをしたりしないでくださいね」
非同期書き込みから保護するのではなく、変数が外力によって変更される可能性がある場合に無効な最適化を無効にするだけです。
編集:潜在的な例として、マルチスレッドを含まない(ただし、非常に複雑なコードを含む;)例として、volatileが重要な場合を次に示します。
volatile bool keepRunning = true;
void Stuff() {
int notAPointer = 0;
notAPointer = (int)(&keepRunning); //Don't do this! Especially on 64-bit processors!
while(keepRunning) {
*(bool*)(notAPointer) = false;
}
printf("The loop terminated!");
}
その揮発性修飾子がないと、コンパイラーは「ねえ、keepRunningは変更されないので、それをチェックするコードを生成する必要さえありません!」となる可能性がありますが、実際には秘密裏に変更しているだけです。
(実際には、これは最適化されていないビルドでも機能する可能性があります。また、コンパイラーがスマートで、ポインターが取得されていることに気付いた場合も機能する可能性があります。ただし、原則は同じです)