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


10

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


4
アトミック操作はスレッドの安全性を保証するのに役立ちますが、どうすれば同じことができるでしょうか 「スレッド」は「操作」と同じではありません。
user50849

回答:


11

アトミック操作は、内部でアトミック操作を使用するミューテックスセマフォなどのある種のロックを使用するか、アトミックおよびメモリーフェンスを使用してロックフリー同期を実装することにより、スレッドセーフティを実現する方法です。

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

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


int、bool、floatはスレッドセーフまたはアトミックですか?
user960567

1
@ user960567-データ型はデータ型です。それらにアクセスする方法を決定するのはコンパイラ次第です。8086 CPUのint64について考えてみます。
mouviciel

2
特にC#では、質問にタグが付けられているため、読み取りと書き込みは基本的なデータ型に対してアトミックである必要あります。Ecma 334を
user50849

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

4
x = 5はC#ではアトミックです。ただし、この操作の直後に上書きされる可能性があります。x = x + 1は、1。xをレジスター2にロードすることで実行されます。xをレジスター3でインクリメントします。xをメモリに保存します。2番目のスレッドが同時に同じことを行う場合、両方が同じ値をロードし、それをインクリメントして格納するため、xは2回ではなく1回だけインクリメントされます。InterlockedIncrementは、特別なプロセッサ命令を使用してアトミック増分を実行するか、CASなどのロックメカニズムを使用してこれを保証し、新しい値が書き込まれていない間は他のスレッドが古い値を読み取らないようにします。
Archy

3

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

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


2

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

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

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

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


変更をロールバックすることが保証されている場合、マルチステップ操作を中断して、アトミックと呼ぶことはできませんか?
user50849

1
いいえ。原子はその語源的意味で理解されるべきです::τομος、atomos、不可分。
mouviciel

int、bool、floatはスレッドセーフまたはアトミックですか?
user960567

しかし、分割できないことと、観察者分割できないように見えることの違いはありませんか?定義上、アトミック操作には単一のステップ以上のものを含めることはできません。Wikipediaの原子操作の定義にある「出現」という言葉は重要だと思います。(誰かがそこに持ち込みたい場合は、チャットに参加しています):)
user50849

大きな違いが1つあります。安全なスレッドが中断される可能性があり、どれだけの時間が保証されるかではありません。これは、リアルタイムコンピューティングで重要です。アトミック操作(マルチステップの場合は割り込みロック付き)は、予測可能な時間後に終了することが保証されています。
mouviciel

1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.