## 9.2\. Happens Before
在一個單獨的goroutine中,變量的讀和寫操作順序和代碼所寫的順序一致。因此,在變量值沒有 被改變的時候, 編譯器和處理器可能會記錄變量的操作順序。但是,這種先驗性的順序記錄會導致 在兩個不同的goroutine對變量操作 順序記錄有差別。例如,一個goroutine執行 a = 1; b = 2; , 但是在另一個goroutine中可能會現感知到b被更新。
為了解決這種二義性問題,Go語言中引進一個happens before的概念,它用于描述 對內存操作的先后順序問題。如果 事件 e1 happens before 事件 e2,我們說 事件 e2 happens after e1。 如果, `事件e1 does not happen before 事件 e2,并且 does not happen after e2,我們說 事件e1和 e2同時發生`。
對于一個單一的goroutine,happens before 的順序和代碼的順序是一致的。
如果能滿足以下的條件,一個對變量v的讀事件r可以 感知到另一個對變量v的寫事件w:
1. 寫事件w happens before 讀事件r。
2. 沒有既滿足 happens after w 同時滿主 happens before r的對變量v的寫事件w。
為了保證讀事件r可以感知對變量v的寫事件,我們首先要 確保w是變量v的唯一的寫事件。同時還要滿足以下條件:
1. 寫事件w happens before 讀事件r。
2. 其他對變量v的訪問必須 happens before 寫事件w 或者 happens after 讀事件r。
第二組條件比第一組條件更加嚴格。因為,它要求在w和 r并行執行的程序中不能再有其他的讀操作。
對于在單一的goroutine中兩組條件是等價的,讀事件可以確保感知到對變量的寫事件。但是,對于在 兩個goroutines共享變量v,我們必須通過同步事件來保證 happens-before 條件 (這是讀事件感知寫事件的必要條件)。
將變量v自動初始化為零也是屬于這個內存操作模型。
讀寫超過一個機器字長度的數據,順序也是不能保證的。
- 1. 關于本文
- 2. Go語言簡介
- 3. 安裝go環境
- 3.1. 簡介
- 3.2. 安裝C語言工具
- 3.3. 安裝Mercurial
- 3.4. 獲取代碼
- 3.5. 安裝Go
- 3.6. 編寫程序
- 3.7. 進一步學習
- 3.8. 更新go到新版本
- 3.9. 社區資源
- 3.10. 環境變量
- 4. Go語言入門
- 4.1. 簡介
- 4.2. Hello,世界
- 4.3. 分號(Semicolons)
- 4.4. 編譯
- 4.5. Echo
- 4.6. 類型簡介
- 4.7. 申請內存
- 4.8. 常量
- 4.9. I/O包
- 4.10. Rotting cats
- 4.11. Sorting
- 4.12. 打印輸出
- 4.13. 生成素數
- 4.14. Multiplexing
- 5. Effective Go
- 5.1. 簡介
- 5.2. 格式化
- 5.3. 注釋
- 5.4. 命名
- 5.5. 分號
- 5.6. 控制流
- 5.7. 函數
- 5.8. 數據
- 5.9. 初始化
- 5.10. 方法
- 5.11. 接口和其他類型
- 5.12. 內置
- 5.13. 并發
- 5.14. 錯誤處理
- 5.15. Web服務器
- 6. 如何編寫Go程序
- 6.1. 簡介
- 6.2. 社區資源
- 6.3. 新建一個包
- 6.4. 測試
- 6.5. 一個帶測試的演示包
- 7. Codelab: 編寫Web程序
- 7.1. 簡介
- 7.2. 開始
- 7.3. 數據結構
- 7.4. 使用http包
- 7.5. 基于http提供wiki頁面
- 7.6. 編輯頁面
- 7.7. template包
- 7.8. 處理不存在的頁面
- 7.9. 儲存頁面
- 7.10. 錯誤處理
- 7.11. 模板緩存
- 7.12. 驗證
- 7.13. 函數文本和閉包
- 7.14. 試試!
- 7.15. 其他任務
- 8. 針對C++程序員指南
- 8.1. 概念差異
- 8.2. 語法
- 8.3. 常量
- 8.4. Slices(切片)
- 8.5. 構造值對象
- 8.6. Interfaces(接口)
- 8.7. Goroutines
- 8.8. Channels(管道)
- 9. 內存模型
- 9.1. 簡介
- 9.2. Happens Before
- 9.3. 同步(Synchronization)
- 9.4. 錯誤的同步方式
- 10. 附錄
- 10.1. 命令行工具
- 10.2. 視頻和講座
- 10.3. Release History
- 10.4. Go Roadmap
- 10.5. 相關資源