14

私は最近、コンペアアンドスワップアトミックアクション(CMPXCHG、.NETのInterlocked.CompareExchangeなど)について読んでいました。

私はそれが内部でどのように機能するか、そしてそれがクライアントからどのように使用されるかを理解しています。

私がよく理解できないのは、誰かがいつCASを使用するのかということです。

ウィキペディアによると:

CASは、セマフォやミューテックスなどの同期プリミティブを実装するために使用されます。同様に、より高度なロックフリーおよびウェイトフリーのアルゴリズムも使用されます。

では、CASの使用法のコードと説明を含む、より一般的な実際のユースケースを誰かに教えてもらえますか?

この質問は言語に依存しないことを意図しているため、どの言語でもかまいません(Cベースまたはx86アセンブリが推奨されます)。

ありがとう!

4

3 に答える 3

9

これは例で簡単にわかります。共有変数にアトミックかつ同時にビットを設定したいとします。

int shared = 0;

void Set(int index) {
 while (true) {
  if (Interlocked.CompareExchange<int>(ref shared, shared | (1 << index), shared) == shared)
   break; //success
 }
}

その間に「古い値」(戻り値)が変更されたことがわかった場合、障害を検出します。

これが起こらなかった場合、同時変更がなかったため、独自の変更が正常に実行されました。

このテクニックを使用すると、かなり複雑なものを実現できます。ただし、複雑になるほど、回転によるパフォーマンスの低下が大きくなります。

CASの重要な特性は、障害が発生する可能性があり、障害を確実に検出できることです。

于 2012-04-24T20:00:31.737 に答える
5

CASを使用して、あるスレッドまたはプロセスにアトミックに値(ビットまたはワード)を設定し、別のスレッド/プロセスがまだ設定していないことをテストします。そのため、マルチスレッド環境でフラグまたはカウンターを取得するために使用されます。

于 2012-04-24T22:03:11.917 に答える
-1

では、CASの使用法のコードと説明を含む、より一般的な実際のユースケースを誰かに教えてもらえますか?

このホワイトペーパーでは、CASを使用して、ロックなしのスレッドセーフキューを実装します。

いくつかの擬似コード例が含まれています。

于 2021-10-11T17:33:58.997 に答える