2016-05-30 5 views
4

CASはどのように機能しますか?どのようにガベージコレクタで動作しますか?問題はどこにありますか?ガベージコレクタなしではどのように動作しますか?ガベージコレクタの有無にかかわらず比較およびスワップ

CASについてのプレゼンテーションを読んで「まれに読んでいる」という問題が多く、ガベージコレクタを使用できる間にCASの使用が便利だと言われていましたが、ガベージコレクタは使用できません。

これについて何か教えてもらえますか?最初にCASの原則をまとめることができれば、それは認められるでしょう。

答えて

0

いいので、CASはアトミック命令です。つまり、特別なハードウェアサポートがあります。 主な用途は、データ構造やその他の操作を実装するときにロックを使用しないことです。ロックを使用するのは、スレッドがページフォルト、キャッシュミス、またはOSによってスケジュール解除されている場合です。そのスレッドと残りのスレッドはすべてブロックされます。これは明らかに重大なパフォーマンス上の問題を引き起こします。 CASはlock-free programmingherehereのコアです。

CASは基本的に以下の通りです:

CAS(CURRENT_VALUE, OLD_VALUE, NEW_VALUE) <=> 
if CURRENT_VALUE==OLD_VALUE then CURRENT_VALUE = NEW_VALUE 

あなたは、変数(例えばクラス変数)を持っており、それは、あなたがそれから読んで、あなたが欲しい時に他のスレッドによって変更されたかどうか、あなたは見当もつかないそれに書き込む。 このCASはアトミックに(ハードウェアで)実行され、そこにロックが実装されていないため、書き込み部分でCASが役に立ちます。したがって、スレッドがスリープ状態になっても残りのスレッドはデータ構造上で動作できます。

非GCシステム上のCASの問題がABA problemで、例は以下の通りである。

You have a single linked list: HEAD->A->X->Y->Z 
Thread 1: let's read A: localA = A; localA_Value = A.Value (let's say 5) 
Thread 2: let's delete A: HEAD->A->X->Y->Z 
Thread 3: let's add a new node at start (the malloc will find the right spot right were old A was): HEAD->A'->X->Y->Z (A'.Value = 10) 
Thread 1 resumes and wants to swap A with B: CAS(localA, A', B) => but this thread expects that if CAS passes the value of A to be 5; wrong: since CAS passes given that localA and A' have the same memory location but localA.Value!=A'.Value => thus the operation shouldn't be performed. 

localAはそのメモリへの参照を保持しているので、GCが有効なシステムでは、これは決して起こらないだろうということですしたがって、A 'は決してそのメモリロケーションに割り当てられません。

関連する問題