寫程式過程中總免不了用到鎖,雖然大牛們總是推薦無鎖程式設計,但那境界對我來說實在太遠了。
專案中的資料資源的訪問,少不了鎖,考慮到都是讀的多,寫的少,於是參考網路,自己實現乙個寫優先的讀寫鎖。
windows下的:
class rwlock
;#include "rwlock.h"
rwlock::rwlock()
rwlock::~rwlock()
void rwlock::readlock()
else
m_pmutex->unlock();
}while(loop);
} void rwlock::readunlock()
m_pmutex->unlock();
} void rwlock::writelock()
else
m_pmutex->unlock();
} while(loop);
m_pmutex->unlock();
} void rwlock::writeunlock()
linux下的:
class rwlock
;#include "rwlock.h"
rwlock::rwlock()
rwlock::~rwlock()
int rwlock::readlock()
reader++;
pthread_mutex_unlock ( &mutex );
} int rwlock::readunlock()
pthread_mutex_unlock ( &mutex );
} int rwlock::writelock()
writer++;
pthread_mutex_unlock(&mutex);
} int rwlock::writeunlock()
用起來,沒出什麼大問題。不過,似乎還有可以優化的地方,比如windows下的那個,應該可以將鎖去掉,換成互斥**段,據說互斥**段比鎖效率高點。而且這個鎖不支援二次加鎖,這個還沒想好有什麼簡單的實現。
鎖的實現並不是什麼大問題,畢竟一些系統都有提供。鎖的粒度,就沒那麼好處理了。工作中碰到的情況是,四個類a,b,c,d,a對a,a對b,b對c,都是一對多的關係,c對d是多對多的關係。覺得使用資料庫太浪費,於是自己維護,在記憶體中組織成一顆樹。如果簡單的幾個鎖,那就會出現太多的等待,如果每個物件都單獨分配乙個鎖,那鎖就太多了,太多的核心物件,好像不是什麼好現象。不知道資料庫怎麼實現的。
想到乙個解決辦法,就是單獨啟乙個執行緒作資料的訪問和修改操作,操作請求都封裝成統一格式。其它執行緒要訪問時就封裝請求,放入佇列,然後sleep。資料操作執行緒從佇列中取出請求執行後,喚醒等待的執行緒。這樣鎖的需求就只剩乙個了---佇列。但省下鎖,卻換成了執行緒的頻繁切換。在併發場合,單獨乙個操作執行緒,說不定還會成為效能瓶頸,難道要弄成乙個執行緒池,讓執行緒數隨佇列裡的請求數量動態變化?額的神啊。
不知道hibernate怎麼實現的。看來應該找時間好好看看。
讀寫鎖的實現
首先介紹下pthread cond t。在linux下稱之為狀態變數,與之相關的有下面幾個api int pthread cond init pthread cond t cond,pthread condattr t cond attr int pthread cond signal pthrea...
讀寫鎖的實現
讀寫鎖主要用來解決讀 讀能共存,讀 寫不能共存,寫 寫不能共存的情況,它的 使用場景主要是讀寫分離,比如自己實現乙個快取,在重新整理快取的時候就需要用到讀寫鎖。下面擼上一段 簡單實現以下。author administrator date 2019 3 3 public class cache ca...
C 實現讀寫鎖ReadWriteLock
1 讀寫鎖基本思想 寫者之間互斥 寫者和讀者之間互斥,而讀者之間並不需要互斥 2 讀寫鎖分為兩種 讀者優先和寫者優先 讀者優先,即當前只要可讀,就是可進入的 寫者優先,讀者需要看看當前是否有寫者要讀,如果有,則等待至沒有寫者正在寫或者需要寫的情況 注 兩種方式,都會存在飢餓現象 include re...