Использование Interlocked.CompareExchange с оператором класса

Оператор 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 по-прежнему не выполняется.

Есть ли способ сделать это? Я хочу сравнить два экземпляра класса и присвоить одному из них значение на основе сравнения.

12
задан Glenn Slayden 1 February 2017 в 23:54
поделиться