36

std::atomic_flagアトミックブールフラグとしてC++を使用しています。フラグをtrueまたはfalseに設定することは問題ではありませんが、フラグを何らかの値に設定せずにフラグの現在の状態を照会するにはどうすればよいですか?atomic_flag_clearメソッド' 'と''があることを知っていますatomic_flag_set。それらは前の状態を返しますが、現在の状態も変更します。フラグの状態を変更せずに照会する方法はありますか、それとも本格的な' std::atomic<bool>'を使用する必要がありますか?

4

3 に答える 3

52

std::atomic_flagに設定しないと、の値を読み取ることはできませんtrue。これは仕様によるものです。これはブール変数ではありませんが(std::atomic<bool>そのためにあります)、C++11をサポートするすべてのアーキテクチャでロックフリーが保証されている最小限のフラグです。

一部のプラットフォームでは、アトミック命令は交換命令のみです。このようなプラットフォームでは、を使用してstd::atomic_flag::test_and_set()実装できますが、値を読み取るためのアトミックな命令はありません。exchange var,1clear()exchange var,0

したがって、値を変更せずに読み取りたい場合は、が必要std::atomic<bool>です。

于 2012-06-19T15:31:34.150 に答える
22

atomic_flagスレッドを終了するかどうかを決定するために使用する場合は、次のように実行できます。

初期化:

std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();

スレッドループ:

while (keep_running.test_and_set()) {
    // do thread stuff
}

スレッドを終了する場合:

keep_running.clear();
于 2015-03-26T19:47:25.717 に答える
2

C ++ 20でtest()、OPが望んでいることを正確に実行するメソッドを取得しました。

于 2021-02-17T16:32:58.703 に答える