[マルチスレッド]ロックフリーのプログラミングおよびCAS

プログラミングのロック/ロックフリー/非ブロック同期しません

ロックフリーのプログラミング、つまり、スレッドが存在しない場合に変数を同期している複数のスレッド間で使用していないロック変数の同期がブロックされたとき、それはまた、非ブロッキング同期(非ブロック同期)と呼ばれています。
ノンブロッキング同期方式は、「ロック・プログラミングアルゴリズム」(ノンブロッキングアルゴリズム)と呼ばれています。
ロックフリーロックフリープログラミングレベル(三つのレベルの合計)の最も一般的な実装です。

なぜ同期をノンブロッキング?

欠点が多い実感ロックスレッドの同期を使用します。
*競争の中で、スレッドが待っているブロックされている場合は、リアルタイム応答スレッドを行うことはできません。
*死んでロック。
*ライブロック。
*優先順位の逆転。
*不適切な使用、パフォーマンスの低下を招きます。
 
ロックが同期変数を達成するために、ケースに使用されていない場合、それは多くの問題を回避します。今ものの、ロックフリーのプログラミングおよび代替ロックではありません。

実装レベル

待っフリー/ロックフリー/閉塞フリー:非同期ブロッキングを実現する3つのレベルに分けることができます。
 
待っフリー
ベストモードで、全体の操作が制限された段階で、各スレッドを確保するために完成されています。
システムレベル保証スループット(システム全体のスループット)と無線飢餓プロセス。
2011年の時点で、少し具体的な実装。場合であっても達成するだけでなく、特定のCPUに依存する必要があります。
 
ロックフリー
個々のスレッド不足を可能にするが、システム・レベルのスループットを確保します。
少なくとも一つのスレッドが実行を継続できることを確認してください。
待つことのないアルゴリズムもロックフリーの必要があります。
 
障害物のありません
任意の時点で、スレッドがトランザクションを実行(他のスレッドを一時停止)を単離する、およびステップの有限数以内に完了する。それは、ロールバック(タイムスタンプ、バージョン番号を使用して)検出された場合に実行時に、データが変更されます。
また楽観的ロック、そのオプティミスティック並行性制御(OOCとしても知られています 1は、読み取り、書き込み、およびタイムスタンプするために、2バージョンチェックを書き込む準備ができて、小切手での3が書き込まれ、検証が渡されていない場合、ロールバック:トランザクションプロセスがあります。
ロックフリー閉塞フリーでなければなりません。

CASプリミティブ

LL / SC、原子リードモディファイライト
CPUは、ロード・リンク/ストア条件付き(LL / SC)この命令を提供する場合、あなたは簡単にCPUレベルの同期せずに変数ロックすることができます。
LL [ADDR]、DST:DSTメモリから値を読み出す[ADDR]で。
SC値は、[ADDR]:LLアクション最後のメモリ値が変更されていないため、現在のスレッドのために、それは新しい値で更新されます。
上記プロセスは、原子がロックフリーリードモディファイライト動作を実現しています。
 
CAS(比較交換)
LL / SCこのCPU命令が達成されていない場合、我々は、CASなどの他のアルゴリズムを、見つける必要があります。
CASは、マルチスレッド同期変数を実装するために使用される命令の原始的なセットです。
X86 CMPXCHGのCASの下で達成命令、いずれかの事前LOCKアトミック操作を実現。2013年のように、マルチコアプロセッサのほとんどは、CASによって支持されています。
プリミティブCASは三つのパラメータ、メモリアドレス、期待値、新しい値を持っています。場合、メモリアドレスの値が==この時点で未修飾値は、新しい値に変更することができることを示し、値を期待します。そうでなければ、それはfalseを返し、修正が失敗したこと、フォローアップするための操作をユーザーが決定しました。
コードをコピー
BOOL CAS(Tの*のADDR、Tは期待、T newValueに)
 { 
      (* ADDR ==予想される)場合
     、{ 
          * ADDR = newValueに。
           trueを返します。
     } 
     それ以外
           はfalseを返します。
 }
コードをコピー

 

ABAの問題
スレッド1は、ヴァル= 1 2、CAS(*ヴァル、1,2)となる動作することを意図しました。
スレッド1は、最初のval = 1を読み、スレッド1は先取り(プリエンプション)ので、スレッド2の操作を。
スレッド2 1に戻っヴァル= 3に変更し、。
スレッド1(実際には、変更されて)「コストで」と同じ、完全なCAS操作を、継続期待と発見しました。
 
CASのABAを使用して動作中の同時データ構造ポインタの数を使用する場合は特に、問題が発生します。
 
ソリューション
ABA ':変更されたか否かを示すために、追加のタグを追加します。

言語

Javaのデモ
AtomicInteger原子=新規のAtomicInteger(1)。
ブールR = atom.compareAndSet(1、2)。
 
C#のデモ
int型I = 1;
Interlocked.Increment(IをREF)。
 
 
補足:ConcurrentLinkedQueue(揮発性が実装サイクルCAS +待つフリーの同時アルゴリズム)

おすすめ

転載: www.cnblogs.com/itplay/p/11121691.html