volatile修饰符和volatile . read /Write的区别是什么?
本文关键字:volatile 区别 是什么 Write read | 更新日期: 2023-09-27 18:13:06
是否Volatile.Read
和Volatile.Write
对非易失性int具有与volatile
修饰符对int的正常读取和赋值完全相同的影响?
动机是防止警告volatile
变量不应该通过ref参数传递给Interlocked
方法。(尽管有警告,我明白程序是正确的,但我不想在我的代码中留下神秘的pragmas。)
//private volatile int suppressListChangedEvents;
private int suppressListChangedEvents;
public void SuppressListChangedEvents()
{
Interlocked.Increment(ref suppressListChangedEvents);
}
public void UnsuppressListChangedEvents()
{
if (Interlocked.Decrement(ref suppressListChangedEvents) < 0)
throw new InvalidOperationException("Too many calls to unsuppress.");
}
protected override void OnListChanged(ListChangedEventArgs e)
{
//if (suppressListChangedEvents != 0) return;
if (Volatile.Read(ref suppressListChangedEvents) != 0) return;
base.OnListChanged(e);
}
同样,我有一个DirectX渲染线程泵,它使用Interlocked.Exchange(ref command, null)
消耗命令,一些命令是使用直接赋值给易失的command
变量产生的。我可以安全地将其更改为Volatile.Write
并删除volatile
修饰符而不引入开销吗?
在理想情况下,我会让编译器拒绝直接引用或赋值给变量,从而使volatile
修饰符变得有用。这将迫使我将引用传递给Volatile或Interlocked,或者传递给本身使用Volatile或Interlocked的方法。
在您的场景中没有区别;唯一的区别是在讨论单个数组元素时:
在c#中,在字段上使用
volatile
修饰符可以保证每个访问该字段使用Volatile.Read
和Volatile.Write
方法,但volatile
修饰符不能应用于array元素。Volatile.Read
和Volatile.Write
方法可以在数组元素。
因此,只要您绝对确定您已经捕获了所有有关字段的用法,您就可以安全地将毯子volatile
更改为显式易失性读/写。