2017-03-17 9 views
0

私はウィキペディアでは、実際の本の中で並行処理でABAの問題を調査していると私はABAの問題の根本原因を理解するとして、私は前にあったようにそのアルゴリズムでは、我々は同じような状態を確認することをpostなぜ自動ガーベジコレクションはABAを除去できないのですか?

次読んだことがあるが、アルゴリズムがその状態を意味します手つかずだった。スタックと

例:

create new stack node(save to `newNode` variable) 

while(true) { 
    oldHead = stack.get(); 
    newNode.next = oldHead; // point_1 
    if(stack.compareAndSet(oldhead, newNode)) { // atomically replace head if now head same as was in start of iteration 
     break; 
    }  
} 

手順ABA問題へのLEED:
初期状態

a->b->c // a-head, c- tail. 
  1. 私たちは、次のそのアルゴリズムを使用してスタックする要素を追加します

    Thread_1は値を追加しようとしますスタックやOSへのはのcompareAndSet操作(point_1)

  2. Thread_2その後、実行ポップ(Thread_1はまだ保留)

    B-> C // B-ヘッド、C-尾の前にスレッドを一時停止します。

  3. Thread_3は、(Thread_1はまだ保留)

    C // C-ヘッド、C-尾をポップを実行します。

  4. Thread_4は次にa(Thread_1が依然として懸濁)

    A-> C //ヘッド、C-尾部を押して実行します。

  5. Thread_1 wake upとand casは、場合によっては望ましくないこともありますが、正常に実行されます。

Althoug this post私は自動ガベージコレクションがこの問題を解決する理由を理解していません。

私はCの専門家ではありませんが、Cでは2つの異なるオブジェクトに1つのメモリ範囲を割り当てることはできません。

もっと明確にすることはできますか?

答えて

0

あなたの混乱の一部は、おそらくデータ構造自体を内容と混ぜているということから来ていると思います。

「適切な」実装では、データ自体ではなく、のデータを含むスタックノードがあります。つまり、Node(a)、Node(b)などです。つまり、あるスレッドがcをスタックにプッシュすると、cを渡しますが、実際にプッシュされるNode(c)になります。

これは、このような環境の中で、ステップ4でスタックに入力されたものだけでaではありません、それは他のスレッドがステップ1でこれらを見ているNode(a)から異なるポインタなりますnew Node(a)、になることを意味し、オブジェクトはビジネス上非常によく似ている可能性があります(つまり、Javaでは、メソッドはtrueを返します)が、ポインタの比較は異なります。 ここで、自動GCが違いを生み出す部分に着きます。ステップ1のブロックされたスレッドは、スタックから後で削除され、ヒープ内のどこにも強い参照がない場合でも、スタック/レジスタのNode(a)の古いインスタンスへの参照を保持します。これにより、そのノードが削除されるのを防ぎ、メモリアドレスが再利用されることを防ぎ、CASを欺くことになります。

あなたは(メモリーワイズ)を削除した場合、スレッド1がクリティカルセクションにまだある間、あなたはここを参照している悪い状況のみ(a)は、非GCの言語で、元のノードが起こる可能性がありますのでご注意ください。これは非常に扱いにくいものです。解放されたメモリブロックへのポインタをスレッドに残しておけば、後で参照解除されないことが本当に必要であることを本当に確認する必要があります。解放されたブロックからのゴミ)。

ノード(x)の形式でインダイレクションのレイヤーを実装せず、クライアントが内部ノードをプッシュ/ポップ/変更するようにコールすると、すべてのベットがオフになります。クライアントは同じノードを2回後で無限ループにつながる。あなたの例では、まず最初に同じノードを削除してから再挿入しますが、データ構造とクライアントコードの間には多くのリーク状態が想定されます。特にロックフリー構造を試したい場合は、マルチスレッド環境では非常に危険です。 。

要約すると、自動GCはABAのすべてのケースを保護しません。これは、死んだオブジェクトへの参照を保持する、積極的に最適化されたロックフリーコードのための、mallocによるメモリの再利用に関連するABAの非常に特殊なケースから保護します。

関連する問題