みんな大好きvolatile

volatileの話はいつしても楽しいですね。
17
めるぽん.c @melponn

volatileを言語の保証する範囲内で有効に活用する方法知らない。というか言語の保証が何なのかも知らない。

2012-02-25 00:34:43
👻 道化師 🃏 @wraith13

@melponn 言語の保証:最適化しない。 有効活用:volite メンバー関数とか const volite メンバー関数とか作れる。

2012-02-25 00:36:42
めるぽん.c @melponn

@wraith13 全然疑問は解消しませんでしたが、とりあえず、ぼらいと!

2012-02-25 00:41:53
あんどちん(安藤敏彦) @andochin

@wraith13 綴り…それはさておき、volatileは組込だと使われます。必ずアクセスしてほしい周辺ICのレジスタへのポインタをvolatileにしたり

2012-02-25 00:43:00
あおいたん @aoi_nagatsuki

@melponn 翻訳単位ないで使われてない様に見えても消さないとかそういうのじゃないの

2012-02-25 00:43:11
めるぽん.c @melponn

@aoi_nagatsuki 使ってないなら消されていいのでは…

2012-02-25 00:46:40
くまぎ @kumagi

あれ、Cのvolatileは読み書き順序には頓着してくれないんだよねぃ?最適化で消えないというだけで。そしてasm volatile("" ::: "memory")をコリコリと書けばコンパイル後の読み書き順序も守ってくれるけど、CPUの実行順序までは整列できない。

2012-02-25 00:46:59
👻 道化師 🃏 @wraith13

@melponn あっれー? 酷いスペルミスww ぼらいと!

2012-02-25 00:48:16
あおいたん @aoi_nagatsuki

@melponn なんか書いてるだけに見えるから消すーとかされると他のスレッドから読んでるーとかの時に困ったり困ったりとかとか

2012-02-25 00:49:36
くまぎ @kumagi

volatileは x=0; while(x==0){} のように、コンパイラにとって最適化したくてたまらないような状況(この例ならwhile(true){}に最適化される)であっても、コンパイラに「マテ!」と明示できるのです便利ですね(棒

2012-02-25 00:52:28
このツイートは権利者によって削除されています。
あんどちん(安藤敏彦) @andochin

@aoi_nagatsuki @melponn それは異なる翻訳単位になるのでは?その場合外部リンケージを持つからvolatileと関係なく消されないような。但しどこからも参照されなければリンカが消す可能性はありますが

2012-02-25 00:53:34
このツイートは権利者によって削除されています。
👻 道化師 🃏 @wraith13

メモリバリアが無くて死亡するフラグw

2012-02-25 00:54:15
このツイートは権利者によって削除されています。
あおいたん @aoi_nagatsuki

@andochin おっさるとおり。volatile関係無いでした

2012-02-25 00:55:08
めるぽん.c @melponn

@aoi_nagatsuki 変なキャストをしない限りスレッドにその値のポインタを渡そうとするコード書いた時点で消されないでしょうし、スレッドだと読む際に不定な値にならなくても順序は保証されなかったはずなので、スレッドではまともに使えないという脳内結論が…。

2012-02-25 00:56:02
くまぎ @kumagi

@SillyCrown C言語のvolatileはマルチスレッドでも話が変わってくれないんです。Javaなら仰る通りメモリバリアを入れてくれるのですが、C言語の場合はvolatileがやってくれる事がとても少ない事を念頭に入れる必要が有ります。

2012-02-25 00:56:28
あおいたん @aoi_nagatsuki

@melponn あいそのとおり。言われて気づいた

2012-02-25 00:58:40
あおいたん @aoi_nagatsuki

@melponn のでまあ値書きかえてないならここじゃなくていいよねー的にコードが移動されたりしたくなかったらvolatileなってことで。たとえば翻訳単位外で値が書きかえられる様なエニシングを条件式に使うとか

2012-02-25 01:00:15
くまぎ @kumagi

@melponn @aoi_nagatsuki 渡した後で書き換えそうに見えなかったら最適化で勝手にループの外に追い出されたりしちゃうのでその回避の為にもvolatileは無意味じゃないです。順序に関してはCでは何も守ってくれないのでそこはvolatile関係無い感じですね。

2012-02-25 01:05:22
あおいたん @aoi_nagatsuki

@kumagi あい、そのたうり。まさにめるぽんせんせいについーとしたところでした

2012-02-25 01:06:14
めるぽん.c @melponn

@aoi_nagatsuki それって、xがexportしてる変数、fがxを使うimportしてきた関数だとして、while(x==0){f();} みたいな場合にxにvolatileが必要ってことですか?

2012-02-25 01:08:09
あおいたん @aoi_nagatsuki

@melponn いえす。書き換わらないならwhileで判定しなくて良いじゃん的にif(x==0){while(true)...}にされたら困るっつー

2012-02-25 01:11:00
中村 実 @nminoru_jp

@kumagi Cにも実行モデルはありますよ。volatileのオブジェクトのアクセスは副作用完了点を跨いで逆転することはないので、Cのソースコード上で文として切れているならvolatileアクセスが逆転したアセンブラ命令列に落ちることはないのでは。メモリモデルはまた別の話ですが

2012-02-25 01:14:25
1 ・・ 4 次へ