基於效率考量,C++ 的 shared_ptr 和 weak_ptr 沒用 lock 保護。shared_ptr 的實作容易理解:
摘錄《C++ and Beyond 2012: Herb Sutter — atomic<> Weapons》裡面相關的投影片:
前一篇文章是以一個小例子從開發者的角度,從上層到下層說明 thread 之間何時會同步資料。這篇只從 C++ 的角度討論 C++11 訂的 API。
Architectures (e.g., x86, ARM) 為了提升效率,會作許多事,這裡借用《C++ and Beyond 2012: Herb Sutter — atomic<> Weapons》的圖:
在 multi-thread 程式實作 singleton 的時候,需要留意 singleton 只能初始化一次。我偏好的作法是在程式還是 single thread 的時候先完成初始化。這個作法簡單易懂。不過我想藉由延遲初始化的實作來說明「thread 之間何時會同步資料」。注意,本文的例子只是用來說明多 CPU 執行 multi-thread 底層發生了什麼事,不見得是 singleton 最好的作法。
之前從軟體的角度寫過 memory barrier 的介紹。《Memory Barriers: a Hardware View for Software Hackers》則是從硬體的角度了解硬體設計者的需求,以及 read/write memory barrier 如何運作。我只有讀完前五章,後面用我理解的方式摘要這篇文章。本文的圖示都是從該篇文章取出來的。