Can you summarize the following document?
        
  當驅動程式執行下列動作時,如果處理器的寫入指令 out-of-order,使得資料還沒有寫入記憶體,硬體模組就被觸發開始動作,就會產生錯誤的行為。

  大多數處理器提供了記憶體屏障指令:  記憶體屏障是底層原語,是記憶體排序的一部分,在不同體系結構下變化很大而不適合推廣。需要認真研讀硬體的手冊以確定記憶體屏障的辦法。x86指令集中的記憶體屏障指令是:  常見的x86/x64,通常使用lock指令字首加上一個空操作來實現,注意當然不能真的是nop指令,但是可以用來實現空操作的指令其實是很多的,比如Linux中採用的  儲存器也提供了另一套語義的記憶體屏障指令: Intel Itanium處理器,具有記憶體屏障mf的指令,具有下述modifiers:

  下述同步函式使用適當的屏障來確保記憶體有序:

  多執行緒程式通常使用高層程式設計語言中的同步原語,如Java與.NET Framework,或者API如pthread或Windows API。因此一般不需要明確使用記憶體屏障。  記憶體可見性問題,主要是快取記憶體與記憶體的一致性問題。一個處理器上的執行緒修改了某資料,而在另一處理器上的執行緒可能仍然使用著該資料在專用cache中的老值,這就是可見性出了問題。解決辦法是令該資料為volatile屬性,或者讀該資料之前執行記憶體屏障。

  C與C++語言中,volatile關鍵字意圖允許記憶體對映的I/O操作。這要求編譯器對此的資料讀寫按照程式中的先後順序執行,不能對volatile記憶體的讀寫重排序。因此關鍵字volatile並不保證是一個記憶體屏障。  對於Visual Studio 2003,編譯器保證對volatile的操作是有序的,但是不能保證處理器的亂序執行。因此,可以使用InterlockedCompareExchange或InterlockedExchange函式。  對於Visual Studio 2005及以後版本,編譯器對volatile變數的讀操作使用acquire semantics,對寫操作使用release semantics。

  編譯器會對生成的可執行程式碼做一定優化,造成亂序執行甚至省略(不執行)。gcc編譯器在遇到內嵌彙編語句: 將以此作為一條記憶體屏障,重排序記憶體操作。即此語句之前的各種編譯優化將不會持續到此語句之後。也可用內建的codice_1  Microsoft Visual C++的編譯器記憶體屏障為:  Intel C++編譯器的記憶體屏障為:
記憶體屏障(英語:Memory barrier),也稱記憶體柵欄,記憶體柵障,屏障指令等,是一類同步屏障指令,它使得 CPU 或編譯器在對記憶體進行操作的時候, 嚴格按照一定的順序來執行, 也就是說在memory barrier 之前的指令和memory barrier之後的指令不會由於系統優化等原因而導致亂序。