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

Место общения программистов C#
Ответить
Anonymous
 Использование Interlocked.CompareExchange с классом

Сообщение Anonymous »

Код: Выделить всё

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(ref a, c, b);
Операция сравнения и обмена завершается с ошибкой. Итак, я переопределил операторы Equals и == для класса X как

Код: Выделить всё

    public override bool Equals(object obj) { return y == ((X) obj).y; }
Итак, теперь я получаю Interlocked.Equals(a,b) как true, но операции CompareExchange по-прежнему не выполняются.

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

Подробнее здесь: https://stackoverflow.com/questions/669 ... th-a-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»