草庐IT

interlocked

全部标签

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

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

c# - Interlocked.Exchange 和 Volatile.Write 之间的区别?

Interlocked.Exchange和Volatile.Write有什么区别?这两种方法都会更新一些变量的值。有人可以总结一下何时使用它们吗?Interlocked.ExchangeVolatile.Write特别是我需要更新数组的double项,我希望另一个线程看到最新的值。什么是首选?Interlocked.Exchange(refarr[3],myValue)或Volatile.Write(refarr[3],info);其中arr是声明为double?真实的例子,我这​​样声明double数组:privatedouble[]_cachedProduct;在一个线程中,我这样

c# - 为什么 Interlocked.Exchange 不支持 Boolean 类型?

.NET团队决定不在Interlocked.Exchange操作中支持bool值有什么实际原因吗?其中一个用法示例是当您想要保证某些代码只执行一次并且您想要为此使用bool标志时。 最佳答案 是的,这是有充分理由的。Interlocked方法的实现需要处理器级别的低级别支持。参见thisanswer例如。当您定义与架构无关的框架时,这是一个问题。在数据类型上实现由Interlocked类支持的低锁技术是很困难的,这些数据类型是native处理器字大小的一小部分。10多年前流行的RISCcpu设计方法强烈反对它。操作数大小和nativ

c# - 引用分配是原子的,那么为什么需要 Interlocked.Exchange(ref Object, Object) 呢?

在我的多线程asmxWeb服务中,我有一个我自己的类型SystemData的类字段_allData,它由几个List组成和Dictionary标记为volatile.系统数据(_allData)偶尔会刷新一次,我通过创建另一个名为newData的对象来实现。并用新数据填充它的数据结构。完成后,我只需分配privatestaticvolatileSystemData_allDatapublicstaticboolLoadAllSystemData(){SystemDatanewData=newSystemData();/*fillnewDatawithup-to-datedata*/..

c++ - 读取互锁变量

假设:A.WIN32下的C++。B.使用InterlockedIncrement()和InterlockedDecrement()递增和递减的正确对齐的volatile整数。__declspec(align(8))volatileLONG_ServerState=0;如果我想简单地读取_ServerState,是否需要通过InterlockedXXX函数读取变量?例如,我见过这样的代码:LONGx=InterlockedExchange(&_ServerState,_ServerState);和LONGx=InterlockedCompareExchange(&_ServerState

c++ - 读取互锁变量

假设:A.WIN32下的C++。B.使用InterlockedIncrement()和InterlockedDecrement()递增和递减的正确对齐的volatile整数。__declspec(align(8))volatileLONG_ServerState=0;如果我想简单地读取_ServerState,是否需要通过InterlockedXXX函数读取变量?例如,我见过这样的代码:LONGx=InterlockedExchange(&_ServerState,_ServerState);和LONGx=InterlockedCompareExchange(&_ServerState