c++實現的一對鎖的封裝(挺有意思的)

       在使用鎖的時候,出現的最多的問題是由於忘記對鎖的釋放從而出現的各種死鎖問題。所以經常會去檢查對應的鎖是否在之後的代碼中得到合適的釋放。前段時間學習到很巧妙的實現,即在構造函數中實現對鎖的鎖定,在析構函數中實現對鎖的釋放,這樣只需要在使用鎖的時候,定義一個鎖,接下來即進入臨界區,最後在退出對應的作用域的時候,自動調用析構函數,對應的鎖自動釋放, 對於一些鎖的簡單使用,還是比較不錯的,個人覺得挺有意思的,拿出來和大家分享下。

----------------------------------------------------------------------------------------------------------------------------------------------------------------

  1. class ThreadRWLock
  2. {
  3. public:
  4.        ThreadRWLock(){
  5.               pthread_rwlockattr_t attr;
  6.               pthread_rwlockattr_init(&attr);
  7.               pthread_rwlock_init(&_rw_lock, &attr); 
  8.         }
  9.        ~ThreadRWLock(){
  10.              pthread_rwlock_destory(&_rw_lock);
  11.          }
  12.         int AcquireRead(void){
  13.              return pthread_rwlock_rdlock(&_rw_lock);
  14.         }
  15.         int AcquireWrite(void){
  16.              return pthread_rwlock_wrlock(&_rw_lock);
  17.         }
  18.         int Release(void){
  19.             return pthread_rwlock_unlock(&_rw_lock);
  20.         }
  21. private:
  22.        pthread_rwlock_t  _rw_lock;
  23. };

----------------------------------------------------------------------------------------------------------------------------------------------------------------
//讀鎖的實現
  1. class ReadLocker
  2. {
  3. public:
  4.   explicit ReadLocker(ThreadRWLock& rwlock): _lock_point(&rwlock)
  5.   {
  6.       _lock_point->AcquireRead();
  7.       _is_lock = true;
  8.   }
  9.   ~ReadLocker(){
  10.     if (_is_lock)
  11.         _lock_point->Release();
  12.   }
  13.   void Lock(){
  14.     if (!_is_lock)
  15.         _lock_point->AcquireRead();
  16.        _is_lock = true;
  17.     }
  18.   void Unlock(){
  19.       if (_is_lock){
  20.          _lock_point->Release();
  21.       }  
  22.       _is_lock = false;
  23.   }

  24. private:
  25.   ThreadRWLock * _lock_point;
  26.   bool is_lock;
  27. };
//讀鎖的使用示例:
  1. void fun(void){
  2.       ThreadRWLock   lock;
  3.       ReadLocker        readlock(lock); //自動獲取讀鎖
  4.      /*
  5.          臨界區
  6.      */
  7.      //退出作用域自動釋放讀鎖
  8. }
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//寫鎖的實現:
  1. class WriteLocker
  2. {
  3. public:
  4.   explicit WriteLocker(ThreadRWLock& rwlock)
  5.               : _lock_point(rwlock){
  6.               _lock_point->AcquireWrite();
  7.               _is_lock = true;
  8.   }
  9.   explicit WriteLocker(ThreadRWLock* rwlock)
  10.             :_lock_point(rwlock){
  11.              _lock_point->AcquireWrite();
  12.               _is_lock = true;
  13.   }
  14.   ~WriteLocker(){
  15.      if(_is_lock)
  16.          _lock_point->Release();
  17.         _is_lock = false;   
  18.       }
  19.    void Lock(){
  20.       if (!_is_lock)
  21.            _lock_point->AcquireWrite();
  22.           _is_lock = true;
  23.    }
  24.    void Unlock(){
  25.      if (_is_lock)
  26.          _lock_point->Release();
  27.         _is_lock = false;
  28.    }
  29. private:
  30.   ThreadRWLock * _lock_point;
  31.   bool _is_lock;
  32. };
//寫鎖的使用示例(與讀鎖類似)
  1. void fun(void){
  2.       ThreadRWLock   lock;
  3.       WriteLocker        writelock(lock); //自動獲取寫鎖
  4.       /*
  5.          臨界區
  6.        */
  7.       //退出作用域自動釋放寫鎖
  8. }
----------------------------------------------------------------------------------------------------------------------------------------------------------------








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章