私はeverything2.comから次のような競合状態の定義を採用しています。
競合状態とは、複数の同時プロセスを実行すると(これらの目的のために、スレッドもプロセスとしてモデル化され、別々のマシンで実行されるプロセスと同様に)、の(指定されていない、通常は指定されていない)詳細に応じて異なる結果が得られる状況です。操作の順序。
次に、第3章の次のサンプルを検討します。競合状態と相互排除:
ただし、最も危険な競合状態には、共有データ構造へのアクセスが含まれます。2つのスレッドが同じデータ構造を同時に更新している場合、変更は一方のスレッドによって部分的に行われ、もう一方のスレッドによって部分的に行われる可能性があります。データ構造の内容が文字化けする可能性があります。これにより、後でデータ構造にアクセスするスレッドが混乱し、クラッシュが発生します。
明らかに、このサンプルには有害な競合状態が含まれています。
この有害な競合状態を回避するための解決策があります。
秘訣は、スレッドが一度に1つずつデータ構造にアクセスするように強制することです。これは、相互排除と呼ばれ、各スレッドが更新を完了して、次のスレッドのために構造を一貫した状態のままにしておくことができます。
上記の定義によれば、上記のソリューションにはまだ競合状態があります。
スレッドAが最初に変更を加えた場合、共有データ構造の最終的なコンテンツはスレッドBによって埋められます。スレッドBが最初に変更を加えた場合、共有データ構造の最終的なコンテンツはスレッドAによって埋められます。
しかし、今では無害な競合状態です。
このサンプルから、次の結論が得られます。
競合状態は、回避できる場合にのみ有害です。
上記の結論の両方の方向または一方の方向だけが正しいか間違っているかはわかりません。それで、この結論を反証するサンプルはありますか?