2

ABA問題についての記事を読んだのですが、理解できないことがあります。私はソースコードを持っていますが、それは機能せず、記事の例に似ていますが、問題を理解していません。これが記事です

http://fara.cs.uni-potsdam.de/~jsg/nucleus/index.php?itemid=6

それは言う:head_の実際の値は同じですが(a)next_ポインタはそうではありません

しかし、どうしてそれができるのでしょうか?2つの構造オブジェクトの場合

struct node {
   node *next;
   data_type data;
};

「head_」と「current」はメモリ内の同じ領域を指しますが、head _->nextとcurrent->nextはどのように異なるポイントを指すことができますか?

また、次のようにも述べています。最後の操作であるfooによるコンペアアンドスワップは、成功すべきではない場合に成功します。

それでは、それは何をすべきでしょうか?同じアドレスをロードして再試行しますか?違いはなんですか?

現在、私のコードでは、オブジェクトに対してCompareAndSwapを実行するという同様の状況があります。これは、別のスレッドによって、同様のアドレスを持つオブジェクトに変更される可能性があります。

deleted.compare_exchange_strong(head, 0);

しかし、変更されたオブジェクトが適切に初期化されており、その次のポインターに初期化されたオブジェクトへのポインターが含まれている場合、問題は何ですか?

前もって感謝します。

4

1 に答える 1

6

「head_」と「current」はメモリ内の同じ領域を指していますが、head_->next と current->next はどのように別の領域を指すことができますか?

彼らはしない; しかし、コードはメソッドの実行中にheadとの両方head->nextが安定している必要がありますpopが、CAS は に対してのみこれを保証しheadます。head->nextを変更せずに変更されないと暗黙のうちに想定していますがhead、これは誤りです。そのため、何かを読み取りcurrent->next、しばらくすると変更されます。

また、次のようにも述べています:

では、どうすればよいのでしょうか。同じ住所を読み込んで、もう一度やり直しますか? 違いはなんですか?

はい。このメソッドは、だれもその構造をいじらないようになるまで待機する (または試行し続ける) 必要があります。

しかし、変更されたオブジェクトが適切に初期化されていて、次のポインタに初期化されたオブジェクトへのポインタが含まれている場合、何が問題になるのでしょうか?

何でもかまいません。クラスの不変条件の違反、二重解放/メモリ リーク、データの損失など。

于 2010-12-09T12:28:14.823 に答える