Tag: interlocked

带枚举的Interlocked.CompareExchange

我正在尝试使用此枚举的Interlocked.CompareExchange : public enum State { Idle, Running, //… } 以下代码无法编译,但这就是我想要做的: if (Interlocked.CompareExchange(ref state, State.Running, State.Idle) != State.Idle) { throw new InvalidOperationException(“Unable to run – not idle”); } 当然我可以使用int而不是枚举并使用属性: private int state = (int)State.Idle; public State { get { return (State)state; } } 然后将枚举转换为int: if (Interlocked.CompareExchange(ref state, (int)State.Running, (int)State.Idle) != (int)State.Idle) { throw new InvalidOperationException(“Unable […]

内存屏障vs内存对内存的影响缓存一致性时序

简化问题: 与内存屏障相比,由互锁操作引起的内存缓存一致性(或“刷新”)的时间是否存在差异? 让我们在C#中考虑 – 任何互锁操作与Thread.MemoryBarrier()。 我相信存在差异。 背景: 我读了很少关于内存障碍的信息 – 所有对预防特定类型的内存交互指令重新排序的影响,但是我找不到关于它们是否应该立即刷新读/写队列的一致信息。 我实际上发现很少有消息来源提到不保证操作的即时性(只保证特定的重新排序是有保证的)。 例如 维基百科 :“但是,要明确的是,这并不意味着任何操作都会在屏障完成时完成;只有完成操作的订购(当它们完成时)才能得到保证” Freebsd.org (障碍是硬件特定的,所以我猜一个特定的操作系统并不重要):“内存屏障只是确定内存操作的相对顺序;它们不保证内存操作的时间” 另一方面,Interlocked操作 – 从他们的定义 – 导致立即刷新所有内存缓冲区以保证更新的最新值更新导致内存子系统用值锁定整个缓存行,以防止从任何访问(包括读取)其他CPU /核心,直到操作完成。 我纠正还是错了? 免责声明: 这是我在这里的原始问题的演变。 在.NET中的可变新鲜度保证(易失性与易失性读取) EDIT1:修复了关于Interlocked操作的声明 – 内联文本。 编辑2:完全删除演示代码+它的讨论(因为一些人抱怨太多的信息)

Interlocked.CompareExchange 使用GreaterThan或LessThan而不是相等

System.Threading.Interlocked对象允许加法(减法)和比较作为primefaces操作。 似乎只是不做相等的CompareExchange,而且作为primefaces比较的GreaterThan / LessThan似乎是非常有价值的。 一个假设的Interlocked.GreaterThan会不会是IL的一个特性,还是一个CPU级function? 都? 缺少任何其他选项,是否可以在C ++或直接IL代码中创建这样的function并将该function公开给C#?

C#Interlocked Exchange

我的游戏有点像这样: public static float Time; float someValue = 123; Interlocked.Exchange(ref Time, someValue); 我想把时间改成Uint32; 但是,当我尝试使用UInt32而不是float值时,它会抗议该类型必须是引用类型。 Float不是引用类型,因此我知道在技术上可以使用非引用类型执行此操作。 是否有任何实用的方法可以使用UInt32 ?