在很多需要高效能的場合下,鎖的設計一直是乙個比較關鍵的問題。無鎖佇列、讀寫鎖分離的佇列在業界以及學術界都已經有很成熟的研究。在網上也有很多資料,但其實有很多實現都是錯誤的。最近在工作中幫忙追查乙個線上問題時,就發現實現乙個正確的版本是比較困難的事情。
背景:實現乙個迴圈佇列,佇列長度已預先分配。支援不同執行緒的多寫多讀。
原本的實現是對讀和寫分別使用了兩個不同的鎖來提公升效能,但是在最早實現的時候並沒有發現到執行緒間資料的同步修改會造成小概率讀取髒資料導致線上服務有問題。
1 size_t queue::pop(int &value)出現的問題原因是_read 和 _write 是存在非法的狀態(_read = _max_size)。考慮這種場景當_read = _write=_max_size-1時,如果乙個執行緒執行了push操作,並停在if (_write == _maxsize).但是由於執行緒間的切換,有兩個執行緒繼續執行了pop操作,那麼就存在乙個執行緒取到了髒資料。2 10 return 1;
11 }
12 return 0;
13 }
14 15 size_t queue::push(int value)
16
24 return 1;
25 }
26 return 0;
27 }
修改的方法可以兩種:1 將讀寫鎖合併成乙個鎖,但是會降低效能 2 修改實現,使_read 和 _write不存在非法狀態
讀寫鎖分離設計模式
總結對資源的訪問一般包括兩種動作 讀和寫,多執行緒同一時刻對資源讀操作,雖然有資源競爭,但是這種競爭不足以引起資料不一致,那麼這個時候直接採用排他鎖的方式,就顯得有些粗暴了。如果對某個資源讀的操作多於寫的操作,那麼多執行緒讀時並不需要加鎖,很明顯對程式效能的提公升有很大的幫助,於是想搞乙個讀寫鎖的簡...
Mysql的讀寫分離
進行mysql的讀寫分離配置之前,應該先進行mysql主從複製的配置工作 wget或者登陸mysql官網查詢其他版本的安裝包 2.將安裝包移動到 usr local 目錄下並進行解壓 mv mysql proxy 0.8.5 linux glibc2.3 x86 32bit.tar.gz usr l...
Mysql的讀寫分離
server2上檢查主從配置 下面開始設定讀寫分離。我們直接使用官方提供的外掛程式mysql proxy。mysql proxy是官方提供的mysql中介軟體產品可以實現負載平衡,讀寫分離,failover等。mysql proxy就是這麼乙個中間層 簡單的說,mysql proxy就是乙個連線池,...