0

正直なところ、私は何も理解していないので、私はcompare_and_swapを解析しようとしています。

do { while (compare_and_swap(&lock, 0, 1) != 0)
; /* do nothing */
/* critical section */
lock = 0;
/* remainder section */
} while (true);



int compare and swap(int *value, int expected, int new_value) {
int temp = *value;
if (*value == expected)
*value = new_value;
return temp;
}

lock が 0 に設定されていると仮定しましょう。

1 つ目: コンペア アンド スワップは 0 を返し、ロックは 1 に設定され、クリティカル セクションは実行され、ロックは 0 に設定されます。

すすいで繰り返す

うまく解析できたかどうかはわかりませんが、compare and swap が test_and_set よりも 1 サイクル少ないサイクルで同じことを実行できる可能性はありますか (スレッドの同時実行性を保証します)?

4

1 に答える 1

0

ここで実際に何を求めているのかを伝えるのは難しいですが、compare_and_swapアトミックではないため、これは の正しい実装ではありません。

正しくアトミックな実装では、通常、コンペア アンド スワップ CPU 命令を利用します。たとえば x86 LOCK CMPXCHG。ただし、比較と交換を実行するためにシステム ライブラリによって提供される関数 ( InterlockedCompareExchangeWindows API など) を使用するか、std::atomic<>C++11 の比較交換関数を使用する方がおそらくはるかに優れています。

于 2013-09-25T08:08:54.503 に答える