例えば、以下のコード
C
1#include<signal.h> 2 3sig_atomic_t interrupted; 4 5void sigint_handler(int signum){ 6 interrupted = 1; 7} 8 9int main(){ 10 signal(SIGINT, sigint_handler); 11 while(!interrupted){ 12 [何かの処理] 13 } 14 return 0; 15}
このコードは sig_atmoic_t interrupted にvolatileが付いていないので最適化するとバグります。
main()からの読み取りは、コンパイラの最適化によって削除されてしまう可能性がある。
真っ先に思ったこと:「知らねぇぇぇ・・・ & なんで??」
最適化によって削除されたり、変更されたりする変数を把握することができません。
**つまり、volatileが必要、不必要な場面がわからない。**ということです。
変数宣言にvolatile修飾子を追加すると、intterruptedはwhileループの繰り返しやシグナルハンドラからアクセスされる際に、必ず元のアドレスからアクセスされることが保証される。
キャッシュできないデータにはvolatileを使う
(キャッシュ?これは・・・CPUに備わっているキャッシュのことですかね?
元のアドレスとはなんのこと?)
皆さんは、どうやってvolatileが必要な部分を見つけているんでしょうか?
プログラムを作る -> 最適化するとバグる -> volatileが必要な部分を探す。
しかし、これだとバグを前提にvolatileを探すことになるので、良い方法とは言えませんが・・・
あるパターンが存在するはずです。
volatile修飾の規則を教えてください。
しかし、全パターンを覚えるんですか??
それは流石に無理ですよね?
_[ここから私の妄想]___________
volatileによる最適化抑止機能は、変数に対してに加えて、関数ごとに抑止できると便利ではないでしょうか?
C
1volatile int buffer_ready; 2char buffer[BUF_SIZE]; 3 4void buffer_init(){ 5 for(size_t i = 0; i < BUF_SIZE; i++) 6 buffer[i] = 0; 7 buffer_ready = 1; 8}
簡単な関数の例なのですが、
volatile宣言がされている場合、コンパイラはそのデータが置かれたメモリに対する読み書きの順序を変更できない。しかし、これらの読み書きと、他のメモリに対する読み書きとの順序を変更してもよい。
したがって、コンパイラはこのループをbuffer_readyへの書き込みの後に移動することができる。これはプログラマの意図に反する。
今回の場合は、buffer_readyが入れ替わっても問題無さそうですが、複雑な関数になると問題になってくるはずです。
そうすると、bufferの方にもvolatileを付ける羽目になり、volatileがどんどん増えていきます。
buffer_init()そのものを最適化抑止させる機能があると便利ではないでしょうか?
ラムダ式って何が便利なのです??
以前の質問で、main()を内をさらに細かい関数単位で分割できる・・・と言ったんですが、すると関数の中もラムダ式を使って細かく最適化抑止を制御できるのではないか?(ラムダ関数を最適化抑止する)
という想像ができます。
ラムダ式の利便性が向上しそうです。
__________________________
まぁ、私の妄想はどうでもいいんですけど・・・関数全体に対して最適化抑止機能が付いているのはどうかなぁ??と思っただけの話なのです。
ここでの疑問は「どうやって、volatile修飾が必要な箇所を見つければ良いんでしょうか??」という疑問です。
パターンがあるなら、是非教えてください。

回答6件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/19 07:29
2018/02/19 07:34
2018/02/19 07:38
2018/02/19 07:38
2018/02/19 07:47 編集
2018/02/19 07:42
2018/02/19 07:44 編集
2018/02/19 07:47 編集
2018/02/19 07:47
2018/02/19 07:51
2018/02/19 08:56 編集
2018/02/19 08:01 編集
2018/02/19 08:01 編集
2018/02/19 08:07
2018/02/19 08:40 編集
2018/02/19 08:16
2018/02/19 08:29 編集
2018/02/19 08:36 編集
2018/02/19 08:45 編集
2018/02/19 09:18
2018/02/19 12:55 編集
2018/02/19 12:23
2018/02/19 13:36
2019/11/08 08:30