根据Web,我发现了以下代码,相当于VB.NET的C#Volatile。
代码参考:How do I specify the equivalent of volatile in VB.net?
Function VolatileRead(Of T)(ByRef Address As T) As T
VolatileRead = Address
Threading.Thread.MemoryBarrier() '*** I mean this line ***'
End Function
Sub VolatileWrite(Of T)(ByRef Address As T, ByVal Value As T)
Threading.Thread.MemoryBarrier() '*** I mean this line ***'
Address = Value
End Sub
我想确切地知道,当我在上面的代码中执行时,Threading.Thread.MemoryBarrier()做了什么以及怎么做?
我可以在C#中编写一个等同于 MemoryBarrier() 的方法吗?
答案 0 :(得分:4)
我可以在C#中编写一个等效于MemoryBarrier()的方法吗?
是......通过查看此表http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
你可以看到,如果你做一个易失性读和一个易失性写,你就会有相同的效果。所以:
private volatile static int Useless = 0;
public static void MemoryBarrier()
{
int temp = Useless;
Useless = temp;
}
请注意,VB.NET中没有 volatile
的真正替代,因为volatile
字段使用" half"记忆障碍,而不是"完整"内存障碍,而在该响应中建议的方法使用" full"记忆障碍,所以速度较慢。
从.NET 4.5开始,您可以使用Volatile.Read和Volatile.Write
在VB.NET中进行模拟public static void MemoryBarrier()
{
int useless = 0;
int temp = Volatile.Read(ref useless);
Volatile.Write(ref useless, temp);
}
或在VB.NET中:
Public Shared Sub MemoryBarrier()
Dim useless As Integer = 0
Dim value As Integer = Volatile.Read(useless)
Volatile.Write(useless, value)
End Sub