web-dev-qa-db-ja.com

「原子オブジェクト」の定義

CおよびC++の標準的な専門用語では、「atomic object」というフレーズは「 object of 原子タイプ、 "ではありませんか?

すべての2語句を明示的に定義する標準はないので、この標準の明示的な定義を省略してもCおよびC++標準に違反しません。それにもかかわらず、私がC++ 17標準(ドラフト ここ )を読んだとき、宗派。 4.7.1(4)、「特定のアトミックオブジェクトへのすべての変更 [〜#〜] m [〜#〜] は、 modification order of [〜#〜] m [〜#〜] "—そして標準が同様の言語を繰り返し使用して、より正確なロジックを区切る場合並行性—誤って誤解しないようにしたいと思います。

「原子オブジェクト」という語句は、

  • object of atomic type

私が想像できる唯一のもっともらしい選択肢は、代わりにそのフレーズが

  • 適切に配置された object ハードウェアがアトミックに処理できるほど十分に小さい。

どっち?

(注:この質問には、CとC++の両方にタグを付けています。これは、アトミックに関しては、2つの標準がほぼ同じ言語を使用しているためです。このため、どちらかの言語の専門家が私の知る限り回答できます。何らかの理由で私が誤っている場合は、Cタグを削除してC++を保持してください。)

参考: この質問 も参照してください。私の質問は予備的なものです。

22
thb

C++標準では、アトミックオブジェクト( [intro.races] )に対する操作と操作の影響に一連のルールを課しています。オブジェクトに対するすべての操作がこれらのルールを満たす場合、そのオブジェクトはアトミックです。

「原子オブジェクト」という語句は「原子タイプのオブジェクト」を意味しますか?

それは標準ではそう述べられていません。しかし、操作の効果はオブジェクトのタイプによって決定されるため、これは不当な結論ではありません。また、それに対応して:原子タイプは、インスタンスが原子オブジェクトであるタイプです。

C++標準ライブラリは、アトミック操作であることが保証されている型のセットと、アトミック操作であることが保証されている型の関数( [atomics] )を提供します。

ハードウェアがそれをアトミックに処理できるほど十分に小さい適切に配置されたオブジェクト。

C++標準では、アトミックオブジェクトの配置やサイズについては何も指定されていません。

オブジェクト/タイプがアトミックであることが保証されている場合( [atomics] を参照)、ハードウェアにそのようなアトミック性の要件がある場合、言語の実装はこれらの要件が満たされることを保証する必要があります。実装では、原子性を強制するためにロックを使用する必要があります。

7
eerorika

私の見解では、原子性-厳密に言えば-はタイプやオブジェクトには適用されず、operationsに適用されます。つまり、操作は原子的であるかどうかです。

「アトミックオブジェクト」とは、そのパブリックインターフェイスがアトミック操作のみを公開するオブジェクトを理解します。つまり、そのオブジェクトで実行できるすべての操作はアトミックです。

CおよびC++では、概念が逆に定義されている場合があります。最初にアトミックオブジェクトを定義し、次にアトミックオブジェクトに関してアトミック操作を定義します。標準の言い回しは主に言語の定義に関係しているため、CとC++がこのように定義することはおそらく理にかなっています。ただし、理論的および抽象的な機能の観点からは、アトミック操作が主な関心事です。

C++には標準のstd::atomic<T>上記の説明に適合するクラステンプレート。

18
bolov

私はCについて答えることができますが、C++は確かにこれらの点でCと同期することを目的としています。

はい、C標準が「アトミックオブジェクト」について語る場合、それはアトミック修飾された有効なタイプのオブジェクトを意味します。しかし、これは明示的に書き留められていないようにも思われるため、追加することをお勧めします。それを見てみます。

また、一部の人々が述べた以外に、アトミックオブジェクトなしではCにはアトミック操作はありません。これはそのように自発的に修正されるため、これらのオブジェクトへのアクセスの原子性は決して損なわれません。

4
Jens Gustedt