在使用鎖的時候,出現的最多的問題是由於忘記對鎖的釋放從而出現的各種死鎖問題。所以經常會去檢查對應的鎖是否在之後的代碼中得到合適的釋放。前段時間學習到很巧妙的實現,即在構造函數中實現對鎖的鎖定,在析構函數中實現對鎖的釋放,這樣只需要在使用鎖的時候,定義一個鎖,接下來即進入臨界區,最後在退出對應的作用域的時候,自動調用析構函數,對應的鎖自動釋放, 對於一些鎖的簡單使用,還是比較不錯的,個人覺得挺有意思的,拿出來和大家分享下。
----------------------------------------------------------------------------------------------------------------------------------------------------------------- class ThreadRWLock
- {
- public:
- ThreadRWLock(){
- pthread_rwlockattr_t attr;
- pthread_rwlockattr_init(&attr);
- pthread_rwlock_init(&_rw_lock, &attr);
- }
- ~ThreadRWLock(){
- pthread_rwlock_destory(&_rw_lock);
- }
- int AcquireRead(void){
- return pthread_rwlock_rdlock(&_rw_lock);
- }
- int AcquireWrite(void){
- return pthread_rwlock_wrlock(&_rw_lock);
- }
- int Release(void){
- return pthread_rwlock_unlock(&_rw_lock);
- }
- private:
- pthread_rwlock_t _rw_lock;
- };
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//讀鎖的實現
- class ReadLocker
- {
- public:
- explicit ReadLocker(ThreadRWLock& rwlock): _lock_point(&rwlock)
- {
- _lock_point->AcquireRead();
- _is_lock = true;
- }
- ~ReadLocker(){
- if (_is_lock)
- _lock_point->Release();
- }
- void Lock(){
- if (!_is_lock)
- _lock_point->AcquireRead();
- _is_lock = true;
- }
- void Unlock(){
- if (_is_lock){
- _lock_point->Release();
- }
- _is_lock = false;
- }
- private:
- ThreadRWLock * _lock_point;
- bool is_lock;
- };
- void fun(void){
- ThreadRWLock lock;
- ReadLocker readlock(lock); //自動獲取讀鎖
- /*
- 臨界區
- */
- //退出作用域自動釋放讀鎖
- }
//寫鎖的實現:
- class WriteLocker
- {
- public:
- explicit WriteLocker(ThreadRWLock& rwlock)
- : _lock_point(rwlock){
- _lock_point->AcquireWrite();
- _is_lock = true;
- }
- explicit WriteLocker(ThreadRWLock* rwlock)
- :_lock_point(rwlock){
- _lock_point->AcquireWrite();
- _is_lock = true;
- }
- ~WriteLocker(){
- if(_is_lock)
- _lock_point->Release();
- _is_lock = false;
- }
- void Lock(){
- if (!_is_lock)
- _lock_point->AcquireWrite();
- _is_lock = true;
- }
- void Unlock(){
- if (_is_lock)
- _lock_point->Release();
- _is_lock = false;
- }
- private:
- ThreadRWLock * _lock_point;
- bool _is_lock;
- };
- void fun(void){
- ThreadRWLock lock;
- WriteLocker writelock(lock); //自動獲取寫鎖
- /*
- 臨界區
- */
- //退出作用域自動釋放寫鎖
- }