私はstd::atomic
変数を認識していませんでしたが、標準で提供されるstd::mutex
(奇妙なことです!)を認識していました。しかし、1つ気がついたことがあります。標準で提供されている2つの一見同じ(私には)原子型があり、以下にリストされています。
std::atomic_flag type
の例でも言及されています-
std :: atomic_flagは、原子のブール型です。 std :: atomicのすべての特殊化とは異なり、ロックフリーであることが保証されています。 std :: atomicとは異なり、std :: atomic_flagはロードまたはストア操作を提供しません。
理解できません。 std::atomic bool type
はロックフリーであるとは限りませんか?それはアトミックではないのですか?
それで、2つの違いは何ですか、いつどちらを使うべきですか?
std :: atomic bool型はロックフリーではありませんか?
正しい。 std::atomic
はロックを使用して実装できます。
それはアトミックではありませんか?
std::atomic
は、ロックを使用して実装されているかどうかにかかわらず、アトミックです。 std::atomic_flag
は、ロックを使用せずに実装されることが保証されています。
違いは何ですかb/w two
ロックフリー保証以外の主な違いは次のとおりです。
std::atomic_flag
は、ロードまたはストア操作を提供しません。
そして、いつどれを使うべきですか?
通常、アトミックブール変数が必要な場合は、std::atomic<bool>
を使用します。 std::atomic_flag
は、カスタムのアトミック構造を実装するために使用できる低レベルの構造です。
std::atomic<T>
は、変数へのアクセスがアトミックであることを保証します。しかし、原子性がどのように達成されるかは述べていません。ロックフリー変数を使用することも、ロックを使用することもできます。実際の実装は、ターゲットアーキテクチャとタイプT
に依存します。
一方、std::atomic_flag
は、ロックフリー技術を使用して実装されることが保証されています。