web-dev-qa-db-ja.com

C ++のatomic_flagクエリの状態

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

32
polapts

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

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

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

48

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();
13
andrewrk