4

タイトルがvolatile示すように、シングルスレッド プログラミングのコンテキストで役立つケースはありますか? 変数の値が常に実際にメモリ内でチェックされるようにするために使用されることを知っているので、アプリ/コンパイラが気付かない方法でその値が (ST アプリで) 変更される可能性がある場合はありますか?

この質問への回答に影響を与えるような言語間の違いを認識していないため、この質問は言語に依存しないままにしておきます。でも、もしあったら教えてください。

編集:私に指摘されたように、質問は言語にとらわれません。次に、C++固有のものにしています(C++バージョンにも違いがあることを読みましたが、この質問が広すぎるほど大きくないことを願っています)。

4

3 に答える 3

4

これは、C および C++ の回答です。

はい!変数がハードウェア レジスタ (I/O デバイスなど) にマップされている場合。アプリケーションとは関係なく、ハードウェアがレジスタを変更します。

例:

extern volatile uint32_t MY_DEVICE_START; // write-only register
extern volatile const uint32_t MY_DEVICE_STATUS; // read-only register
extern volatile uint32_t MY_DEVICE_DATA; // read-write register

...
MY_DEVICE_DATA = 42; // send input to the device
MY_DEVICE_START = 1; // start the device
while (MY_DEVICE_STATUS == 0) {} // busy-wait for the device to finish
int result = MY_DEVICE_DATA; // read output from the device
...

少なくとも C/C++ では、それが主な理由です。Volatile は、マルチスレッドでの使用にはお勧めできません

于 2016-02-04T10:37:27.987 に答える
3

他の答えは何であるかに対処していますvolatileが、私が使用する実際の例を挙げたいと思いますvolatile(特別なハードウェアメモリの場所から読み書きすることなく)。

volatileC または C++ プログラムで役立つ1 つの例は、デバッグです。次の例を検討してください。

void do_thing(const std::vector<int>& v) {
    if (v.empty()) {
        do_thing_1();
    } else {
        do_thing_2();
    }
}

上記の関数をテストし、デバッグ中に true または false の分岐を強制するvolatile場合は、if 条件に変数を挿入できます。

void do_thing(const std::vector<int>& v) {
    volatile bool condition = v.empty();
    if (condition) {
        do_thing_1();
    } else {
        do_thing_2();
    }
}

volatileオプティマイザーが変数を完全に最適化しないようにします。これにより、 にブレークポイントを設定するのが簡単になり、if変更することができますcondition( を変更する必要はありませんv)。

condition変数を変数にすることもできるstaticので、ブレークポイントに何度もアクセスする必要はありません。一度ヒットして設定すると、選択した内容が「記憶」されます。

確かにこれはハックですが、特定の状況では非常に役立つことがわかりました。

于 2016-02-04T16:09:08.077 に答える
1

シングル スレッド プログラムでもシグナル処理を行うことができ、非マルチスレッド プラットフォームでもハードウェア割り込み処理を使用できるため、ハンドラ関数で変更された非ローカル変数は として宣言する必要がありますvolatile

ps答えは多かれ少なかれ一般的であり、すでに上で述べたように言語によっては正しくない場合があります。

于 2016-02-04T10:56:19.477 に答える