• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++のvolatileについて)

C++のvolatileについて

このQ&Aのポイント
  • C++のvolatileについて調査した結果、その概念や使い方がよく分からず困っています。
  • volatileはマルチスレッドやメモリマップドi/oに使用されますが、具体的なコード例や実際の使い方が知りたいです。
  • また、loop変数の値をマルチスレッドで変更することで意味のある処理が可能になると説明されていますが、具体的にどのように機能するのか理解することができません。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

volatile は「処理系には認識できない方法で値が変化することがあるので, 極端な最適化をしてはならない」というヒントです. 挙がっている例だと, 「while文の中でloopの値を変更していない」ので処理系が「while の条件は loop って書いてあるけど, これは true にしたまま変えてないから loop を true で置き換えちゃえ」とするかもしれません. ところが volatile をつけて loop を宣言すると「ここには書いてないけど loop の値は変化するかもしれない」ということがわかるので, 上のような極端な最適化をすることはなくなります. 「プログラムの実行パスからはわからない値の変化」なので, マルチスレッドでなくとも signal とかが絡むと意味を持ちます.

noname#139165
質問者

お礼

ご回答ありがとうございました。 参考にします。

その他の回答 (3)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

#2です。一箇所訂正です。 > 関数内ではloopの値が変わらない ではなく > ループ内ではloopの値が変わらない です。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

「どうやってマルチスレッドプログラムにするか」の部分は置いておきます。 別途それなりの量の勉強が必要な箇所ですからここで全部を行うのは無理ですし、スレッド関係はOSのAPI依存でもあるので。 で、質問のコードに以下のコードを付加します。 void Fuga() { loop = false; } このコードで、HogeとFugaをそれぞれ別スレッドで動かすことでループから脱出するようにできます。 が。本題のvolatileの出番はここからです。 Hogeのwhileループは、コンパイラによっては最適化されて「関数内ではloopの値が変わらない」ので無条件ループ(while(1)と同じ)に置き換えられてしまう事があります。 こうなってしまうと、外でloopの中身を変更してもHogeが見ていないのでループを脱出できなくなってしまいます。 volatile修飾子は、この最適化を抑止して常にちゃんとloopの値を見るコードを生成するようコンパイラに指示するためのものなのです。

noname#139165
質問者

お礼

ご回答ありがとうございました。 参考にします。

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

>これはどういうことでしょうか。 アセンブラコードを確認すればわかると思いますが このようなコードを書いた場合 volatileにしないと場合によって最適化されて 値のチェックを行わないコードが吐き出されます (初回に読み込んで永久ループ) その為他の所で値を変えてもループから抜けない といったことが起こりえます volatileにすることでそういったことを避けられます (都度値をチェック) >どうしたら良いでしょうか。 volatile bool loop; に変える

noname#139165
質問者

お礼

ご回答ありがとうございました。 参考にします。

関連するQ&A