![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
C++のvolatileについて
volatileはマルチスレッドやメモリマップドi/oに使われるようですが、volatileの概念や使い方がさっぱり分かりません。
Webサイトで調べてもあまり意味が分からないし、参考になるサイトがなかなか見つからないので、ここで質問しました。
volatileでマルチスレッドを使った例のコードを教えてください。
また、以下のコードでは、「while文の中でloopの値を変更していないので、これはシングルスレッドでは単なる無限ループになり、あまり意味のない処理になる。ところが、マルチスレッドの場合は別のスレッドからloopの値を変更される可能性があるため、意味のある処理になる」というものですが、これはどういうことでしょうか。
-------------------------
bool loop;
void Hoge(){
loop=true;
int n=0;
while(loop){
++n;
}
cout << n << endl;
}
-------------------------
上記のコードは、そのままでは無限ループになる。マルチスレッドにしてloopの値を変更するにはどうしたら良いでしょうか。
No.4ベストアンサー
- 回答日時:
volatile は「処理系には認識できない方法で値が変化することがあるので, 極端な最適化をしてはならない」というヒントです. 挙がっている例だと, 「while文の中でloopの値を変更していない」ので処理系が「while の条件は loop って書いてあるけど, これは true にしたまま変えてないから loop を true で置き換えちゃえ」とするかもしれません. ところが volatile をつけて loop を宣言すると「ここには書いてないけど loop の値は変化するかもしれない」ということがわかるので, 上のような極端な最適化をすることはなくなります.
「プログラムの実行パスからはわからない値の変化」なので, マルチスレッドでなくとも signal とかが絡むと意味を持ちます.
No.2
- 回答日時:
「どうやってマルチスレッドプログラムにするか」の部分は置いておきます。
別途それなりの量の勉強が必要な箇所ですからここで全部を行うのは無理ですし、スレッド関係はOSのAPI依存でもあるので。
で、質問のコードに以下のコードを付加します。
void Fuga()
{
loop = false;
}
このコードで、HogeとFugaをそれぞれ別スレッドで動かすことでループから脱出するようにできます。
が。本題のvolatileの出番はここからです。
Hogeのwhileループは、コンパイラによっては最適化されて「関数内ではloopの値が変わらない」ので無条件ループ(while(1)と同じ)に置き換えられてしまう事があります。
こうなってしまうと、外でloopの中身を変更してもHogeが見ていないのでループを脱出できなくなってしまいます。
volatile修飾子は、この最適化を抑止して常にちゃんとloopの値を見るコードを生成するようコンパイラに指示するためのものなのです。
No.1
- 回答日時:
>これはどういうことでしょうか。
アセンブラコードを確認すればわかると思いますが
このようなコードを書いた場合
volatileにしないと場合によって最適化されて
値のチェックを行わないコードが吐き出されます
(初回に読み込んで永久ループ)
その為他の所で値を変えてもループから抜けない
といったことが起こりえます
volatileにすることでそういったことを避けられます
(都度値をチェック)
>どうしたら良いでしょうか。
volatile bool loop; に変える
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- その他(プログラミング・Web制作) PythonでLoopを使って配列内の文字列を結合する。そして [] を削除する 1 2022/03/31 23:28
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
for文while文の無限ループの違...
-
break文でループを一気に抜ける...
-
入力した文字列から母音だけを...
-
UWSCにてある一定の動作を無限...
-
エクセルでC言語のfor文と同じ...
-
プログラムで関数は使わない方...
-
PIC のプログラムについて ど...
-
ループの特定入力終了
-
C言語、whileループを抜け出す...
-
While文の終わりにセミコロンが...
-
Excel VBAで年度をまたぐ期間の...
-
プログレスバーで
-
C言語 数字を削除する関数
-
基本情報技術平成21年春午後問8...
-
Cプログラムが終了しない
-
入力した数値を倍々するプログラム
-
if文を使わずに奇数・偶数を判断
-
H8/3048マイコンAD/DA変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
For文の終了値を関数にしても問...
-
C言語forループが完結した場合...
-
エクセルVBAで Do While (1)って?
-
入力した文字列から母音だけを...
-
if文の中にfor文なのか、for文...
-
Excel VBAで年度をまたぐ期間の...
-
C言語、whileループを抜け出す...
-
for文while文の無限ループの違...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
PIC のプログラムについて ど...
-
アルゴリズムです!四つの数字...
-
UWSCにてある一定の動作を無限...
-
繰り返し文の利点について
-
ループの特定入力終了
-
PAD図の書き方
おすすめ情報