簡體   English   中英

這個內存屏障是否正確實現?

[英]Is this memory barrier implemented correctly?

我正在閱讀遺留的C ++代碼,其中內存屏障定義如下。 主要操作系統是linux和vxworks。 編譯器是gcc(WindRiver的gcc)。

#if((KCompilerGNU)||(kCompilerWindRiver))
   #define MEMORY_BARRIER   __asm__ volatile("nop\n");
#else
   #define MEMORY_BARRIER   __asm nop;
#endif

但我不知道無操作操作如何產生內存屏障? 或者它只是一個錯誤實現?

這是一個編譯器障礙,而不是完整的硬件內存障礙。 也就是說,它是一個不透明的調用,編譯器無法對其進行優化,但它在內存重新排序方面對硬件沒有任何影響1 如果所討論的編譯器確實將asm塊視為不透明(例如,gcc asm塊具有用於精確定義塊中可以改變的內容的特定規則等),則可以為此目的正確定義它。

如果您知道此代碼所針對的硬件具有永不重新排序內存操作的強大內存模型,則可能適合將其稱為完整內存屏障(通常會抑制編譯器和硬件重新排序)。


1也就是說,在程序是單線程或機器沒有表現出有趣的重新排序的情況下(例如,簡單的有序,非推測CPU或單CPU系統),這樣的障礙仍然是足夠的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM