当我完全运行MemoryBarrier()时会发生什么?怎么做?

时间:2015-06-11 09:45:19

标签: c# .net vb.net thread-safety volatile

根据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() 的方法吗?

1 个答案:

答案 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.ReadVolatile.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