2015-06-11 73 views
1

根據Web,我找到了下面的代碼,相當於VB.NET的C#Volatile。當我正好運行MemoryBarrier()時發生了什麼?怎麼樣?

碼參考: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()的方法嗎?

+4

[良好的開端(HTTP ://www.albahari.com/threading/part4.aspx#_Memory_Barriers_and_Volatility)。 – Sinatr

+0

@Sinatr非常感謝 – Behzad

回答

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領域使用的「半壁江山」記憶障礙,而不是「完全」內存壁壘,而這是在響應建議的方法使用「完整」內存屏障,因此速度較慢。

從.NET 4.5,您可以通過使用Volatile.ReadVolatile.Write

public static void MemoryBarrier() 
{ 
    int useless = 0; 
    int temp = Volatile.Read(ref useless); 
    Volatile.Write(ref useless, temp); 
} 

或VB.NET模擬它在VB.NET:

Public Shared Sub MemoryBarrier() 
    Dim useless As Integer = 0 
    Dim value As Integer = Volatile.Read(useless) 
    Volatile.Write(useless, value) 
End Sub 
+0

非常感謝你[像](http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/),但我不明白什麼是你的代碼的意思我想知道MemoryBarrier如何工作? – Behzad

+1

@BehzadKhosravifar「volatile」意思和「MemoryBarrier」是什麼的解釋是相當複雜和技術性的。如果你閱讀他們給你的「開始的好地方」鏈接,並且如果有必要,你可以提出具體的問題。 – xanatos

相關問題