gpt4 book ai didi

c# - 将 Interlocked.CompareExchange 与类一起使用

转载 作者:可可西里 更新时间:2023-11-01 08:18:10 26 4
gpt4 key购买 nike

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);

比较和交换操作失败。因此,我将类 X 的等于和 == 运算符重写为

    public override bool Equals(object obj) { return y == ((X) obj).y; }

所以,现在我得到 Interlocked.Equals(a,b)true,但是 CompareExchange 操作仍然失败。

有什么方法可以做到吗?我想比较两个类实例并根据比较结果为其中之一赋值。

最佳答案

没有。这是不可能的。

Interlocked.CompareExchange 基本上直接映射到能够自动比较和交换内存地址内容的汇编指令。我相信在 32 位模式下,指令的 64 位版本可用(以及 32 位和 16 位版本),而在 64 位模式下,我认为 128 位版本可用。但仅此而已。 CPU 没有“基于其特定 Equals 函数的交换 .NET 类”指令。

如果你想交换任意对象,使用任意相等函数,你必须自己做,使用锁或其他同步机制。

an overload Interlocked.CompareExchange 函数适用于对象引用,但出于上述原因,它使用了引用相等性。它只是比较引用,然后交换它们。

针对您的评论,使用结构并不能解决问题。同样,CPU 只能原子地比较和交换某些固定大小的值,并且它没有抽象数据类型的概念。可以使用引用类型,因为引用本身具有有效大小,并且可以由 CPU 与另一个引用进行比较。但是 CPU 对引用指向的对象一无所知。

关于c# - 将 Interlocked.CompareExchange 与类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6690386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com