一個簡單的進程間mutex和讀寫鎖類

因爲最近一直在做程序使用共享內存的改造,自然也就涉及到進程間同步的問題,以下是一個簡單的進程間鎖的例子,通過在父進程聲明,然後在fork出來的子進程變可以使用這個鎖的對象來進程數據訪問的互斥控制。
 

  1. #ifndef _SHARE_LOCK_H_  
  2. #define _SHARE_LOCK_H_  
  3. //進程間mutex,在父進程定義,fork之後加鎖解鎖對父子進程間有效  
  4. class ShareMutex  
  5. {  
  6.     public:  
  7.         ShareMutex::ShareMutex();  
  8.         ShareMutex::~ShareMutex();  
  9.         void Lock();  
  10.         void UnLock();  
  11.     private:  
  12.         pthread_mutex_t* m_pMutex;  
  13. };  
  14.  
  15. //進程間讀寫鎖,fork之後加鎖解鎖對父子進程間有效  
  16. class ShareRwlock  
  17. {  
  18.     public:  
  19.         ShareRwlock::ShareRwlock();  
  20.         ShareRwlock::~ShareRwlock();  
  21.         void WrLock();  
  22.         void RdLock();  
  23.         void UnLock();  
  24.     private:  
  25.         pthread_rwlock_t* m_pRwlock;  
  26. };  
  27. #endif 

 

  1. #include "ShareMutex.h"  
  2.  
  3. ShareMutex::ShareMutex()  
  4. {  
  5.     m_pMutex = (pthread_mutex_t *)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);  
  6.     pthread_mutexattr_t attr_perf;  
  7.     pthread_mutexattr_init(&attr_perf));  
  8.     pthread_mutexattr_setpshared(&attr_perf, PTHREAD_PROCESS_SHARED);  
  9.     pthread_mutex_init(g_perf_mutex, &attr_perf);      
  10. }  
  11.  
  12.  
  13. ShareMutex::~ShareMutex()  
  14. {  
  15.     m_pRwLocked_mutex_destroy(m_pMutex);  
  16.     munmap(m_pMutex, sizeof(pthread_mutex_t));  
  17. }  
  18.  
  19. //www.it165.net  
  20. void ShareMutex::Lock()  
  21. {  
  22.     if(0 != pthread_mutex_lock(m_pMutex))  
  23.     {  
  24.         throw TCException("ShareMutex::Lock() exception!");  
  25.     }  
  26. }  
  27.  
  28.  
  29. void ShareMutex::UnLock()  
  30. {  
  31.     if(0 != pthread_mutex_unlock(m_pMutex))  
  32.     {  
  33.         throw TCException("ShareMutex::UnLock() exception!");  
  34.     }  
  35. }  
  36.  
  37.  
  38. ShareRwlock::ShareRwlock()  
  39. {  
  40.     m_pRwlock = (pthread_rwlock_t *)mmap(NULL, sizeof(pthread_rwlock_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);  
  41.     pthread_rwlockattr_t attr_pub;   
  42.     pthread_rwlockattr_init( &attr_pub );   
  43.     pthread_rwlockattr_setpshared( &attr_pub, PTHREAD_PROCESS_SHARED );   
  44.     pthread_rwlock_init( m_pRwLock, &attr_pub );  
  45. }  
  46.  
  47.  
  48. ShareRwlock::~ShareRwlock()  
  49. {  
  50.     pthread_rwlock_destroy(m_pRwlock);  
  51.     munmap(m_pRwlock, sizeof(pthread_rwlock_t));  
  52. }  
  53.  
  54.  
  55. void ShareRwlock::WrLock()  
  56. {  
  57.     if(0 != pthread_rwlock_wrlock( m_pRwLock ))  
  58.     {  
  59.         throw TCException("ShareRwlock::WrLock() exception!");  
  60.     }  
  61. }  
  62.  
  63.  
  64. void ShareRwlock::RdLock()  
  65. {  
  66.     if(0 != pthread_rwlock_rdlock( m_pRwLock ))  
  67.     {  
  68.         throw TCException("ShareRwlock::RdLock() exception!");  
  69.     }  
  70. }  
  71.  
  72.  
  73. void ShareRwlock::UnLock()  
  74. {  
  75.     if(0 != pthread_rwlock_unlock( m_pRwLock ))  
  76.     {  
  77.         throw TCException("ShareRwlock::UnLock() exception!");  
  78.     }  

參考文獻:http://www.it165.net/pro/html/201206/2758.html

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