草庐IT

Interlocked

全部标签

c# - Interlocked.CompareExchange<Int> 使用 GreaterThan 或 LessThan 而不是相等

System.Threading.Interlocked对象允许将加法(减法)和比较作为原子操作。似乎不做相等但同时将GreaterThan/LessThan作为原子比较的CompareExchange将非常有值(value)。假设的Interlocked.GreaterThan是IL的功能还是CPU级别的功能?两者都有?如果没有其他选择,是否可以在C++或直接IL代码中创建这样的功能并将该功能公开给C#? 最佳答案 您可以buildotheratomicoperationsoutofInterlockedCompareExchan

c# - Interlocked.CompareExchange<Int> 使用 GreaterThan 或 LessThan 而不是相等

System.Threading.Interlocked对象允许将加法(减法)和比较作为原子操作。似乎不做相等但同时将GreaterThan/LessThan作为原子比较的CompareExchange将非常有值(value)。假设的Interlocked.GreaterThan是IL的功能还是CPU级别的功能?两者都有?如果没有其他选择,是否可以在C++或直接IL代码中创建这样的功能并将该功能公开给C#? 最佳答案 您可以buildotheratomicoperationsoutofInterlockedCompareExchan

c# - 读取由其他线程上的 Interlocked 更新的 int

(这是重复:HowtocorrectlyreadanInterlocked.Increment'edintfield?但是,在阅读答案和评论后,我仍然不确定正确的答案。)有些代码不属于我,也无法更改为使用在多个不同线程中递增int计数器(numberOfUpdates)的锁。所有调用都使用:Interlocked.Increment(refnumberOfUpdates);我想在我的代码中读取numberOfUpdates。现在因为这是一个整数,我知道它不能撕裂。但是确保我获得最新值(value)的最佳方法是什么?看来我的选择是:intlocalNumberOfUpdates=Inte

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

System.Threading.Interlocked.CompareExchange运算符提供比较和交换操作的原子(因此线程安全)C#实现。例如inti=5;Interlocked.CompareExchange(refi,10,5);执行此命令后,inti的值=10。并且比较和交换以原子方式发生(单个操作)。当我尝试将它与类实例一起使用时,比较失败并且没有交换值。publicclassX{publicinty;publicX(intval){y=val;}}当我这样做的时候Xa=newX(1);Xb=newX(1);Xc=newX(2);Interlocked.CompareEx

c# - Java原子整数和C#Interlocked.Increment方法的区别

我只是想知道,在线程环境中,在Java和C#中递增静态变量的方式有区别吗?在Java中,您使用atomicint:s进行此操作,而在C#中,您使用Interlocked.Incement(refyourVar)我说的不是你写的代码,而是它实际上是如何锁定内存并进行实际增量的。 最佳答案 互锁操作不锁定内存,而是根据操作向指令发出LOCK前缀。这会导致处理器断言总线锁定,因此只执行一次指令。你可以进一步查看followingarticle 关于c#-Java原子整数和C#Interlock

java - .Net 的 Interlocked 类在 Java 中的等价物是什么?

如何在Java中以原子方式和线程安全地修改int?原子递增、测试和设置等...? 最佳答案 使用AtomicInteger. 关于java-.Net的Interlocked类在Java中的等价物是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1152298/

c# - Interlocked.CompareExchange 与枚举

我正在尝试使用Interlocked.CompareExchange使用此枚举:publicenumState{Idle,Running,//...}以下代码无法编译,但这是我想要做的:if(Interlocked.CompareExchange(refstate,State.Running,State.Idle)!=State.Idle){thrownewInvalidOperationException("Unabletorun-notidle");}当然我可以使用int而不是enum并使用属性:privateintstate=(int)State.Idle;publicState

c# - Interlocked.Increment 实际上在做什么?

Interlocked.Increment似乎是需要在多线程代码中执行的最标准/最简单的操作之一。我假设该方法的功能是某种排序模式,任何具有线程经验的人都能够复制。所以基本上我想知道的是,是否有人可以提供Interlocked.Increment方法实际上在内部执行的操作的精确副本(并解释其工作原理)?(我一直在寻找实际方法的来源,但一直找不到) 最佳答案 据Albahari先生说它做了两件事:让操作系统和虚拟机知道操作的原子性,例如在32位系统上对64位值的操作将是原子的生成fullfence限制互锁变量的重新排序和缓存看看那个链

c# - Interlocked.CompareExchange 是否使用内存屏障?

我正在阅读JoeDuffy关于Volatilereadsandwrites,andtimeliness的帖子,我正在尝试了解帖子中最后一个代码示例的一些内容:while(Interlocked.CompareExchange(refm_state,1,0)!=0);m_state=0;while(Interlocked.CompareExchange(refm_state,1,0)!=0);m_state=0;…当执行第二个CMPXCHG操作时,它是否使用内存屏障来确保m_state的值确实是最新写入的值?或者它会使用一些已经存储在处理器缓存中的值吗?(假设m_state未声明为vol

c# - 为什么没有接受 Doubles 作为参数的 Interlocked.Add 重载?

我非常欣赏Threading.Interlocked类提供的原子性;不过,我不明白为什么Add函数只提供两个重载:一个用于Integers,另一个用于Longs。为什么不是Doubles或任何其他数字类型?显然,更改Double的预期方法是CompareExchange;我猜这是因为修改Double比修改Integer更复杂。我仍然不清楚为什么,如果CompareExchange和Add都可以接受整数,它们不能同时接受double值。 最佳答案 其他人已经解决了“为什么?”。但是,使用CompareExchange原语可以很容易地滚