2016-09-05 4 views
29

私はstd::atomic変数を認識していませんでしたが、標準によって提供されているstd::mutex(奇妙な権利!しかし、一つのことは、私の目を引いた。標準の原子boolと原子フラグの差

  1. ​​タイプ

  2. std::atomic_flagタイプ

:下記に記載されている標準で提供(私には)一見、同じ2つの原子の種類があり、また、それは、std::atomic_flag typeの例で言及されている -

標準: :atomic_flagはアトミックブール型です。 std :: atomicのすべての特殊化とは異なり、ロックフリーであることが保証されています。 std :: atomicとは異なり、std :: atomic_flagはロード操作やストア操作を行いません。

私は理解できません。 std::atomic bool typeはロックフリーであることが保証されていませんか?それは原子的ではないのですか?

2人の違いは何ですか?また、どの場合に使うべきですか?

+2

"アトミック"と "ロックフリー"は同義語ではありません。アトミックでなくても簡単にロックフリーにすることができます(これは、たとえばP:のような同期を行わない場合に起こります)、ロックフリーではないアトミック操作を簡単に行うことができますモニター)。 – Luaan

答えて

21

std :: atomic boolタイプはロックフリーではありませんか?

正しい。 std::atomicは、ロックを使用して実装できます。

これはアトミックではありませんか?

std::atomicは、ロックを使用して実装されているかどうかに関係なく、アトミックです。 std::atomic_flagは、ロックを使用せずに実装されることが保証されています。

だから、/ wの2

B違い何ロックフリー保証以外の主な違いは次のとおりです。

std::atomic_flagは、ロードまたはストアオペレーションを提供していません。


と私が使用する必要がありますか?

アトミックブール変数が必要な場合は、通常、std::atomic<bool>を使用します。 std::atomic_flagは、カスタム原子構造を実装するために使用できる低レベル構造です。

+2

ターゲットアーキテクチャがアトミック操作をサポートする場合、ロックを使用する理由はありません。しかし、そうでなければ、* std :: atomic_flag'をどうやって実装するのだろうか? – rustyx

+0

[編集用]読み込みとストアはブール型の 'std :: atomic'とは関係がないかもしれないが、他の型となるためです。 –

+6

@RustyX:すべての既存のアーキテクチャは、少なくとも原子的なロード・アンド・セット・ワード(または同等の否定されたロード・クリア・ワード)をサポートしています。これは 'std :: atomic_flag'を実装するのに十分です。 PA-RISCを参照してください。ここで 'ldcw'は唯一のアトミックRMW演算です。 – Fanael

18

std::atomic<T>は、変数へのアクセスがアトミックであることを保証します。しかし、どのように原子性が達成されたかは言わない。ロックフリー変数を使用することも、ロックを使用することもできます。実際の実装は、ターゲットアーキテクチャとタイプTによって異なります。一方、ロックフリー技術を用いて実装されることが保証されている。