ディスカッションから、アトミック操作とスレッドセーフは同じものであるように見えますが、多くの人がそれらは異なると言います。違いがあれば、誰かに違いを教えてもらえますか?
ディスカッションから、アトミック操作とスレッドセーフは同じものであるように見えますが、多くの人がそれらは異なると言います。違いがあれば、誰かに違いを教えてもらえますか?
回答:
アトミック操作は、内部でアトミック操作を使用するミューテックスやセマフォなどのある種のロックを使用するか、アトミックおよびメモリーフェンスを使用してロックフリー同期を実装することにより、スレッドセーフティを実現する方法です。
したがって、プリミティブデータ型のアトミック操作はスレッドセーフを実現するツールですが、通常は互いに依存する複数の操作があるため、スレッドセーフを自動的に保証しません。これらの操作は、ミューテックスなどを使用して中断せずに実行する必要があります。
はい、これらのアトミックデータ型のいずれかをc#で書き込むことはスレッドセーフですが、それでスレッドセーフで使用する関数は作成されません。2番目のスレッドが「同時に」アクセスした場合でも、単一の書き込みが正しく実行されることが保証されるだけです。それでも、現在のスレッドからの次の読み取りでは、別のスレッドが書き込んだ可能性があるため、以前に書き込まれた値を取得することは保証されず、読み取られた値が有効であることが保証されます。
原子性とスレッドセーフは2つの異なるものです。原子性とは、操作の「オールオアナッシング」品質を指します。操作を100%正常に実行できない場合、システムは、操作の一部が開始される前の全体的な状態を維持する必要があります。典型的な例はデータベーストランザクションです。ヘッダーと複数のラインアイテムを含む請求書を保存するときは、すべてのデータベース行のすべての部分を正常に配置する必要があります。そうでない場合、データは失われるか破損します。広告申込情報を挿入できない場合は、他の行が挿入されないだけでなく、処理済みの行も残りません。
スレッドセーフとは、操作を「再入可能」にすることを可能にする、原子性を含むものの組み合わせを指します。複数のワーカーが同じ操作を実行し、同時にまたは異なる時間に開始して、他に影響を与えることはありません。スレッドセーフ操作には多くのモデルがあります。それらのほとんどは、概念的に煮詰めて、複数の並列タスクを完全に分離して実行する(2人のワーカーは、他のワーカーが存在することさえ知らなくても、2つの異なるオブジェクトまたはオブジェクトのコレクションで同じタスクを実行できます)、または「パイプライン」を設定します複数のワーカーがそれぞれ、操作全体から1つのタスクを実行します(各ワーカーは最初のタスクから次のタスクに進むか、1つのタスクに焦点を当ててその中間の "作業成果物"を次のワーカーに渡します)。
アトミック操作は、中断できない操作です。
安全なスレッドとは、安全に中断できるスレッドです。
スレッドセーフは、特に重要なリソースへの複数回のアクセスを防ぐロジックで、アトミック操作で取得されます。
基本的なアトミック操作はTest-and-setであり、セマフォの実装に使用され、スレッドセマフォはスレッドセーフの実装に使用されます。