System.Threading.Interlocked.CompareExchange
operator は、Compare-And-Swap 操作のアトミック (スレッドセーフ) C# 実装を提供します。
たとえば、int i = 5; Interlocked.CompareExchange(ref i, 10, 5);
このコマンドの後、int i は値 = 10 になります。また、比較と交換はアトミックに行われます (単一操作)。
これをクラスインスタンスで使用しようとすると、比較が失敗し、値が交換されません。
public class X
{
public int y;
public X(int val) { y = val; }
}
今私がするとき
X a = new X(1);
X b = new X(1);
X c = new X(2);
Interlocked.CompareExchange<X>(ref a, c, b);
比較および交換操作は失敗します。そこで、クラス X の Equals と == 演算子を次のようにオーバーライドしました。
public override bool Equals(object obj) { return y == ((X) obj).y; }
だから、今は として取得Interlocked.Equals(a,b)
しますtrue
が、CompareExchange
操作はまだ失敗します。
これを行う方法はありますか?2 つのクラス インスタンスを比較し、それらの 1 つに比較に基づいて値を割り当てたいと考えています。