天天看點

讀寫鎖分離的循環隊列

在很多需要高性能的場合下,鎖的設計一直是一個比較關鍵的問題。無鎖隊列、讀寫鎖分離的隊列在業界以及學術界都已經有很成熟的研究。在網上也有很多資料,但其實有很多實作都是錯誤的。最近在工作中幫忙追查一個線上問題時,就發現實作一個正确的版本是比較困難的事情。 

      背景:實作一個循環隊列,隊列長度已預先配置設定。支援不同線程的多寫多讀。

      原本的實作是對讀和寫分别使用了兩個不同的鎖來提升性能,但是在最早實作的時候并沒有發現到線程間資料的同步修改會造成小機率讀取髒資料導緻線上服務有問題。

讀寫鎖分離的循環隊列
讀寫鎖分離的循環隊列

      出現的問題原因是 _read 和 _write 是存在非法的狀态(_read = _max_size)。考慮這種場景當_read = _write=_max_size-1時,如果一個線程執行了push操作,并停在if (_write == _maxsize).但是由于線程間的切換,有兩個線程繼續執行了pop操作,那麼就存在一個線程取到了髒資料。

      修改的方法可以兩種:1 将讀寫鎖合并成一個鎖,但是會降低性能 2 修改實作,使 _read 和 _write不存在非法狀态

讀寫鎖分離的循環隊列

View Code

繼續閱讀