回答編集履歴
1
追記
answer
CHANGED
@@ -2,4 +2,13 @@
|
|
2
2
|
|
3
3
|
最適化は基本的に関数内で行われますから、関数内での変更だけであれば、おかしな動作にならないように最適化されます。(当然ですね。)
|
4
4
|
しかし、関数の外(割り込みや他のスレッド)で変更されるとコンパイラはその状況を把握できませんので、プログラマが教えて上げる必要があります。
|
5
|
-
つまり、関数が動作中に、割り込みや他のスレッドにて変更される変数にvolatileを付けます。
|
5
|
+
つまり、関数が動作中に、割り込みや他のスレッドにて変更される変数にvolatileを付けます。
|
6
|
+
|
7
|
+
---
|
8
|
+
【yohhoyさんとの議論にて追記】
|
9
|
+
データ競合が発生する場合は、一般にロックやアトミック変数でデータ競合を回避します。
|
10
|
+
対スレッドの場合はその機構により、最適かも抑止されるのでvolatileは付けなくて良いと標準規格にて決まっているそうです。
|
11
|
+
ただし、対シグナルハンドラーについては標準規格でvolatileを付ける必要があるそうです。
|
12
|
+
|
13
|
+
シグナルハンドラーを実装するケースは稀でしょうから、ちゃんとデータ競合を回避しておけば、一般にはvolatileは付けなくても大丈夫と考えて良さそうです。
|
14
|
+
質問のサンプルはシグナルハンドラーですので、volatileが必要なようです。
|