web-dev-qa-db-ja.com

標準のアトミックboolとアトミックフラグの違い

私はstd::atomic変数を認識していませんでしたが、標準で提供されるstd::mutex(奇妙なことです!)を認識していました。しかし、1つ気がついたことがあります。標準で提供されている2つの一見同じ(私には)原子型があり、以下にリストされています。

  1. std::atomic<bool> タイプ

  2. std::atomic_flag タイプ

std::atomic_flag typeの例でも言及されています-

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

理解できません。 std::atomic bool typeはロックフリーであるとは限りませんか?それはアトミックではないのですか?

それで、2つの違いは何ですか、いつどちらを使うべきですか?

40
hg_git

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

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

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

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

違いは何ですかb/w two

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

std::atomic_flagは、ロードまたはストア操作を提供しません。


そして、いつどれを使うべきですか?

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

29
eerorika

std::atomic<T>は、変数へのアクセスがアトミックであることを保証します。しかし、原子性がどのように達成されるかは述べていません。ロックフリー変数を使用することも、ロックを使用することもできます。実際の実装は、ターゲットアーキテクチャとタイプTに依存します。

一方、std::atomic_flagは、ロックフリー技術を使用して実装されることが保証されています。

23
michalsrb