teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/02/19 09:33

投稿

Chironian
Chironian

スコア23274

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が必要なようです。