2012-06-19 13 views
26

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

+1

その唯一の用途はロックを取得する手段であると思われます。 'std :: atomic_flag'を共有リソースにアクセスする前に取得できるロックとして使うことができますが、その共有リソースが単に' bool'であれば、 'std :: atomic '。 _Edit:_またはむしろstd :: atomic_bool、彼らはあなたのために1つの専門の悩みに行ってきた方法を見て! – Rook

+5

正しい取得/解放のセマンティクスを使用していない場合(つまり、atomic_flag_setでロックしてから実際に値を変更した場合のみ)、現在の状態を知ることはできません。それを読むだけで、あなたがそれを読んだときの価値は何かを教えてくれるでしょう、そして、それはすぐ後に変わったかもしれません。 –

+0

@Mike:それは本当に重要ですか? OPが望んでいるような音は、アトミックな読み込みを実行する能力と、順序付けされた読み書きの概念を持つ能力です。 – Rook

答えて

39

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

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

値を変更せずに値を読み取る場合は、std::atomic<bool>が必要です。

+0

ちょうどあなたの本を引用したいと思っていた.... – haohaolee

+0

私はそれをデバッグ目的の値として印刷したいと思うので、本当に気にしないでしょうか?私は今、 '.__ val'要素を使っていますが、gccのいくつかのバージョンでは間違っています(正しいと思いますので) – user1273684

+0

' std :: atomic_flag'の値を変更せずにそれ。 (printfのデバッグの場合でも)それを読むには 'std :: atomic 'が必要です –

12

あなたは、スレッドが終了する必要があるかどうかを判断するために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();