jjzjj

Volatile

全部标签

c# - 如何保证 Array 中 "reference type"项目的更新对其他线程可见?

privateInstrumentInfo[]instrumentInfos=newInstrumentInfo[Constants.MAX_INSTRUMENTS_NUMBER_IN_SYSTEM];publicvoidSetInstrumentInfo(Instrumentinstrument,InstrumentInfoinfo){if(instrument==null||info==null){return;}instrumentInfos[instrument.Id]=info;//needtomakeitvisibletootherthreads!}publicInstru

c# - 易变的日期时间

因为DateTime不能声明为volatile,这样对吗?privateDateTime_time;publicDateTimeTime{get{Thread.MemoryBarrier();return_time;}set{_time=value;Thread.MemoryBarrier();}}该属性可以从不同的线程访问,所以我想确保它们始终获得最新版本,而不使用争用(lock)。编辑:我有一组难以创建的项目,每个项目都有一个名为CreationTime的DateTime属性,指示该项目的创建时间。它被初始化为DateTime.UtcNow。每次访问项目时,该属性都会更新为Date

C# volatile 和 Nullable

根据文档:http://msdn.microsoft.com/en-us/library/x13ttww7.aspx:volatile关键字可以应用于引用类型。那么为什么在Nullable上使用是非法的?..引用类型!请注意,我实际上并不需要Nullable上的可变语义领域,我偶然遇到了这个错误,只是好奇。 最佳答案 Nullable不是引用类型。这是一个值类型:publicstructNullablewhereT:struct,new()注意struct部分。仅仅因为它有一个nullvalue不会使其成为引用类型...它是可以为n

C# volatile double

因为只有引用类型和一些基元(包括float,但不包括double,我不确定原因,我很高兴听到原因)可以声明为volatile,如果我在类中包装double然后将其声明为volatile(如下所示),double属性是否会像任何其他volatile一样是“读写”线程安全的,还是我仍然应该考虑锁定?publicclassMyThreadedClass{volatileVolatileDoublevoldub;}publicclassVolatileDouble{publicdoubleDouble{get;set;}} 最佳答案 dou

c# - C# 中的可变字段

来自规范10.5.3可变字段:volatile字段的类型必须是以下之一:引用类型。类型byte,sbyte,short,ushort,整数、单位、字符、float、bool值、System.IntPtr或System.UIntPtr。具有枚举基类型的枚举类型byte,sbyte,short,ushort,int,或单位。首先我想确认我的理解是正确的:我猜想上面的类型可能是易变的,因为它们在内存中存储为一个4字节的单元(对于引用类型,因为它的地址),这保证了读/写操作是原子的。double/long/etc类型不能是易失的,因为它们不是原子读/写,因为它们在内存中超过4个字节。我的理解正

c# - 多处理器系统中 volatile 关键字的成本是多少?

我们遇到了性能问题,一个潜在的罪魁祸首是集中使用volatile单例。具体代码形式为classfoo{staticvolatileinstance;staticobjectl=newobject();publicstaticfooInstance{if(instance==null)lock(l){if(instance==null)instance=newfoo();}returnfoo();}}这是在一个8路盒子上运行的,我们看到上下文切换到每秒500,000次。典型的系统资源很好——25%的cpu利用率、25%的内存利用率、低IO、无分页等。使用volatile字段会导致内存屏障

c# - 我可以避免对很少更改的变量使用锁吗?

我一直在阅读JoeDuffy关于并发编程的书。我有一个关于无锁线程的学术问题。首先:我知道无锁线程充满了危险(如果你不相信我,请阅读书中关于内存模型的部分)不过,我有一个问题:假设我有一个带有int属性的类。这个属性引用的值会被多个线程非常频繁地读取值发生变化的情况极为罕见,当发生变化时,将由单个线程进行更改。如果它确实发生了变化,而另一个使用它的操作正在运行中,没有人会失去一根手指(任何人使用它所做的第一件事就是将它复制到局部变量)我可以使用锁(或readerwriterlockslim来保持读取并发)。我可以将变量标记为volatile(很多例子都是这样做的)但是,即使是volat

c# - 对Volatile.Read/Write的理解

我正在尝试了解C#Volatile类。正如我所读:Volatile.Write方法强制写入location中的值到通话点。此外,任何较早的程序顺序加载和存储必须在调用Volatile.Write之前发生。Volatile.Read方法强制读取location中的值在通话时。此外,任何以后的程序顺序加载和存储必须发生在调用Volatile.Read之后。这是否意味着:internalsealedclassThreadsSharingData{privateInt32m_flag=0;privateInt32m_value=0;//Thismethodisexecutedbyonethre

c# - 属性有 volatile 影响吗?

在下面的代码中,read1是否始终等于read2,前提是可以从其他线程更改属性Flag?这里的问题是Flag可能会被内联。privateboolFlag{get;set;}publicvoidMultithreadedMethod(){varread1=Flag;/*somemorecode*/varread2=Flag;}UPD:一些其他线程可能会在/*somemorecode*/执行期间更改Flag的值。在这种情况下,read1应该不同于read2。总是会这样吗?不会内联将属性转换为非volatile字段,这将导致read1等于read2,尽管事实上Flag在两者之间发生了变化读?

c# - 使闭包捕获的变量易变

闭包捕获的变量如何与不同的线程交互?在下面的示例代码中,我想将totalEvents声明为易变的,但C#不允许这样做。(是的,我知道这是错误的代码,这只是一个例子)privatevoidWaitFor10Events(){volatileinttotalEvents=0;//errorCS0106:_someEventGenerator.SomeEvent+=(s,e)=>totalEvents++;while(totalEvents编辑:人们似乎有点忽略了我的问题。我知道我不能在本地变量上使用volatile。我也知道示例代码代码不好,可以用其他方式实现,因此我的“错误代码”免责声明