web-dev-qa-db-ja.com

アトミック操作とスレッドセーフの違いは?

私が見た議論から、アトミック操作スレッドセーフティは同じものであるように見えますが、多くの人がそれらは異なると言います。違いがあれば、誰かに違いを教えてもらえますか?

10
user960567

アトミック操作は、内部でアトミック操作を使用する Mutexes または Semaphores のようなある種のロックを使用するか、または lock free を実装することにより、スレッドセーフティを達成する方法です。 =アトミックとメモリフェンスを使用した同期。

したがって、プリミティブデータ型に対するアトミック操作はスレッドセーフを実現するツールですが、通常は互いに依存する複数の操作があるため、スレッドセーフを自動的に保証しません。これらの操作は、ミューテックスなどを使用して中断せずに実行する必要があります。

はい、これらのアトミックデータ型のいずれかをc#で書き込むことはスレッドセーフですが、それによって、それらを使用する関数がスレッドセーフになるわけではありません。 2番目のスレッドが「同時に」アクセスした場合でも、単一の書き込みが正しく実行されることを保証するだけです。それでもなお、現在のスレッドからの次の読み取りでは、別のスレッドが書き込んだ可能性があるため、以前に書き込まれた値を取得することは保証されません。

11
Archy

原子性とスレッドセーフは2つの異なるものです。原子性とは、操作の「オールオアナッシング」品質を指します。操作を100%正常に実行できない場合、システムは、操作の一部が始まる前の全体的な状態を維持する必要があります。典型的な例はデータベーストランザクションです。ヘッダーと複数のラインアイテムを含む請求書を保存する場合、すべてのデータベース行のすべての部分を正常に配置する必要があります。そうでない場合、データは失われるか破損します。ラインアイテムを挿入できない場合、他の行が挿入されないだけでなく、すでに処理された行も残りません。

スレッドセーフとは、操作を「再入可能」にすることを可能にする、原子性を含むものの組み合わせを指します。複数のワーカーが同じ操作を実行し、同時にまたは異なる時間に開始して、他に影響を与えることはありません。スレッドセーフ操作には多くのモデルがあります。それらのほとんどは、概念的に煮詰めて、複数の並列タスクを完全に分離して実行する(2人のワーカーは、他のワーカーが存在することさえ知らなくても、2つの異なるオブジェクトまたはオブジェクトのコレクションで同じタスクを実行できます)、または「パイプライン」を設定します複数のワーカーがそれぞれ操作全体から1つのタスクを実行します(各ワーカーは最初のタスクから次のタスクに進むか、1つのタスクに焦点を当てて中間の「作業成果物」を次のワーカーに渡します)。

3
KeithS

アトミック操作は、中断できない操作です。

安全なスレッドとは、安全に中断できるスレッドです。

スレッドセーフは、特に重要なリソースが複数回アクセスされるのを防ぐロジックで、アトミック操作で取得されます。

基本的なアトミック操作は Test-and-set です。これはセマフォの実装に使用され、セマフォはスレッドセーフの実装に使用されます。

2
mouviciel

スレッドセーフはフレームワークまたは「概念」であり、アトミック操作はサブセットであり、ステータスを「スレッドセーフ」として分類される手段(多くの1つ)です。

スレッドセーフとは、別のスレッドからアクセスできるプロセスのことで、1つのアクセス(およびデータの操作)によって他のスレッドの操作の整合性が損なわれることはありません。

プログラマーのスキルの多くは、状況と主要な目的に応じて、これを達成する方法を知っています。たとえば、ロック、セマフォ、ラッチ、アトミックオブジェクト、同期ルールなどを実装する必要があります。

1
ADP