回答編集履歴

1

追記

2018/02/19 09:33

投稿

Chironian
Chironian

スコア23272

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