4

compare_and_swap_if_greater_than() と論理的に同等のものを実行するロックレスな方法を知っている人はいますか? これは実際には compare_and_swap_if_equal() です。私が今持っている最善の方法は、スピンミューテックスを使用することですが、履歴変数、ループ、compare_and_swap() を賢く使用すると、これを回避できる可能性があると思います。

4

1 に答える 1

1

これはどう:

public static void CompareAndSwapIfGreaterThan(ref int location, int newValue) {
  while(true) {
    var currentValue=Thread.VolatileRead(ref location);
    if(newValue<=currentValue
      || Interlocked.CompareExchange(ref location, newValue, currentValue)==currentValue) {
      return;
    }
  }
}
于 2011-09-20T03:34:19.830 に答える