基本原則:
1. 不要假設有順序
2. 執行緒任何時候都有可能被中斷
3. 注意共用資源
volatile:
1. 從記憶體拿,存記憶體,而不是暫存器。亦即該變數的讀寫"必須照順序確實執行"
2. 修改變數的執行緒會在修改變數後從其他函數返回,或是呼叫其他函數,該變數就不會被放在暫存器中
區間鎖定式函數和所有同步功能都會設立記憶體藩籬(記憶體藩籬內對記憶體的讀寫"必須照code上的順序確實執行",而且在離開藩籬之前所有的讀寫都會完成)
volatile是禁止compiler的reordering optimizations
memory barrier是禁止CPU的out-of-order execution,並保證不同顆CPU的cache會一致
總結:
volatile是禁止compiler的優化,確保CPU每次都從記憶體取值、寫入記憶體,而非從暫存器取值、寫入暫存器
記憶體藩籬是禁止CPU的優化,確保不同顆CPU的cache一致,並讓變數寫入記憶體