Оператор System.Threading.Interlocked.CompareExchange
предоставляет атомарную (таким образом потокобезопасную) реализацию на 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);
Операция сравнения и обмена не выполняется. Итак, я переопределил Equals и оператор == для класса X как
public override bool Equals(object obj) { return y == ((X) obj).y; }
Итак, теперь я получаю Interlocked.Equals (a, b)
как true
, но Операция CompareExchange
по-прежнему не выполняется.
Есть ли способ сделать это? Я хочу сравнить два экземпляра класса и присвоить одному из них значение на основе сравнения.