请问Volatile.Read
和Volatile.Write
对于非易失性整数的影响是否与正常读取和分配对于带有volatile
修饰符的整数相同?
目的是为了防止出现警告,即不应该通过ref参数传递volatile
变量到Interlocked
方法中。(我知道尽管出现警告程序仍然正确,但我不想在我的代码中留下晦涩的预处理指令。)
//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
修饰符,是否会引入开销?EDIT:明确的答案。今后,我将避免使用修饰符并始终通过Volatile和Interlocked明确地访问变量。这样代码就不会对访问类型存在歧义。修改变量声明也不会改变代码的含义。
在完美的世界中,我会使用编译器拒绝直接引用或分配变量的能力来使
volatile
修饰符有用。这将强制我通过Volatile或Interlocked或一个本身使用Volatile或Interlocked的方法传递引用。我应该找到Roslyn的副本。