同步鎖的類型

1)lock-free  算法

Lock-free 算法一般比基於鎖的算法要好: 緩存

  • 從其定義來看,它們是 wait-free 的,能夠確保線程永遠不會阻塞。
  • 狀態轉變是原子性的,以致於在任何點失敗都不會惡化數據結構。
  • 由於線程永遠不會阻塞,因此當同步的細粒度是單一原子寫或比較交換時,它們一般能夠帶來更高的吞吐量。
  • 在某些狀況下,lock-free 算法會有更少的同步寫操做(好比 Interlocked 操做),所以純粹從性能來看,它可能更便宜。

可是 lock-freedom 並非萬能藥。下面是一些很明顯的不利因素: 數據結構

  • 樂觀的併發使用會對 hot data structures 致使 livelock。
  • 代碼須要大量困難的測試。一般其正確性取決於對目標機器內存模型的正確解釋。
  • 基於衆多緣由,lock-free 代碼很難編寫和維護

2) CAS: 架構

    CAS的原理是,將舊值與一個指望值進行比較,若是相等,則更新舊值
併發

     CAS 的原子性徹底取決於硬件實現。大多數 Intel 和 AMD 的 CPU 採用了一種叫作 MOSEI 緩存一致性協議來管理緩存。這種架構下,處理器緩存內 CAS 操做相對成本低廉。但一旦資源爭用,就會引發緩存失效和總線佔用。緩存越失效,總線越被佔用,完成 CAS 操做也越被延遲。緩存爭用是程序可伸縮性殺手。固然對於非 CAS 內存操做來講也是如此,但 CAS 狀況更加槽糕。 dom

  • CAS 操做要比普通內存操做花費更多 CPU 週期。這歸功於緩存分級的額外負擔、刷新寫緩衝區與穿越內存柵欄限制和需求以及編譯器對 CAS 操做優化的能力。
  • CAS 常常被用在優化並行操做上。這意味着 CAS 操做失敗將致使從新嘗試某些指令(典型的回滾操做)。即使沒有任何爭用,它也會作一些無用功。不論成功或失敗都會增長爭用的風險。

3)fetchandadd 性能

原子隊列等則被證實不足以良好的同步兩個以上的線程 測試

4) pthread_lock: fetch

當多個控制線程共享相同的內存時,須要確保每個線程看到一致數據視圖。若是不存在讀取數據或者全部數據只讀時不會存在一致性問題。若是某個線程正在修改變量而其餘線程也能夠讀取或者修改這個變量的時候就須要對這些線程進行同步。在變量修改多於一個存儲器訪問週期時可能出現不一致的錯誤 優化

相關文章
相關標籤/搜索