一、為什么需要內存屏障
內存屏障的引入,本質上是由於CPU重排序指令引起的。重排序問題無時無刻不在發生,主要源自以下幾種場景:
- 編譯器編譯時的優化;
- 處理器執行時的多發射和亂序優化;
- 讀取和存儲指令的優化;
- 緩存同步順序(導致可見性問題)
二、內存屏障的分類
barrier()就是compiler提供的屏障,作用是告訴compiler內存中的值已經改變,之前對內存的緩存(緩存到寄存器)都需要拋棄,barrier()之后的內存操作需要重新從內存load,而不能使用之前寄存器緩存的值。並且可以防止compiler優化barrier()前后的內存訪問順序。barrier()就像是代碼中的一道不可逾越的屏障,barrier前的 load/store 操作不能跑到barrier后面;同樣,barrier后面的 load/store 操作不能在barrier之前。