讀寫鎖的實現方法

對於某個臨界資源的訪問,讀操作和寫操作是要區別對待的。讀操作可以多個線程同時進行,寫操作必須互斥進行。

讀寫鎖當已經被加了讀鎖時,其他的讀模式鎖請求仍然可以訪問,但是寫模式鎖不能訪問;當寫模式鎖加鎖時,其他的請求都不能訪問。


本文嘗試用四種方法來完成讀寫鎖的操作,都包含有寫模式和讀模式各自所要做的事情。

1、直接使用POSIX提供的讀寫鎖

2、用條件變量實現讀寫鎖

3、用互斥量實現讀寫鎖

4、用信號量實現讀寫鎖


直接使用讀寫鎖

pthread中直接爲我們提供的。
  1. #include <pthread.h>      //多線程、讀寫鎖所需頭文件  
  2.   
  3. pthread_rwlock_t  rwlock = PTHREAD_RWLOCK_INITIALIZER; //定義和初始化讀寫鎖  
  4.   
  5. 寫模式:  
  6. pthread_rwlock_wrlock(&rwlock);     //加寫鎖  
  7. 寫寫寫……  
  8. pthread_rwlock_unlock(&rwlock);     //解鎖    
  9.   
  10.   
  11.   
  12. 讀模式:  
  13. pthread_rwlock_rdlock(&rwlock);      //加讀鎖  
  14. 讀讀讀……  
  15. pthread_rwlock_unlock(&rwlock);     //解鎖   

用條件變量實現讀寫鎖

這裏用條件變量+互斥鎖來實現。注意:條件變量必須和互斥鎖一起使用,等待、釋放的時候都需要加鎖。
  1. #include <pthread.h> //多線程、互斥鎖所需頭文件  
  2.   
  3. pthread_mutex_t  mutex = PTHREAD_MUTEX_INITIALIZER;      //定義和初始化互斥鎖  
  4. pthread_cond_t  cond = PTHREAD_COND_INITIALIZER;       //定義和初始化條件變量  
  5.   
  6.   
  7. 寫模式:  
  8. pthread_mutex_lock(&mutex);     //加鎖  
  9. while(w != 0 || r > 0)  
  10. {  
  11.      pthread_cond_wait(&cond, &mutex);      //等待條件變量的成立  
  12. }  
  13. w = 1;  
  14.   
  15. pthread_mutex_unlock(&mutex);  
  16. 寫寫寫……  
  17. pthread_mutex_lock(&mutex);  
  18. w = 0;  
  19. pthread_cond_broadcast(&cond);       //喚醒其他因條件變量而產生的阻塞  
  20. pthread_mutex_unlock(&mutex);    //解鎖  
  21.   
  22.   
  23. 讀模式:  
  24. pthread_mutex_lock(&mutex);       
  25. while(w != 0)  
  26. {  
  27.      pthread_cond_wait(&cond, &mutex);      //等待條件變量的成立  
  28. }  
  29. r++;  
  30. pthread_mutex_unlock(&mutex);  
  31. 讀讀讀……  
  32. pthread_mutex_lock(&mutex);  
  33. r- -;  
  34. if(r == 0)  
  35.      pthread_cond_broadcast(&cond);       //喚醒其他因條件變量而產生的阻塞  
  36. pthread_mutex_unlock(&mutex);    //解鎖  


用互斥鎖實現讀寫鎖

這裏使用2個互斥鎖+1個整型變量來實現。
  1. #include <pthread.h> //多線程、互斥鎖所需頭文件  
  2. pthread_mutex_t r_mutex = PTHREAD_MUTEX_INITIALIZER;      //定義和初始化互斥鎖  
  3. pthread_mutex_t w_mutex = PTHREAD_MUTEX_INITIALIZER;   
  4. int readers = 0;     //記錄讀者的個數  
  5.   
  6. 寫模式:  
  7. pthread_mutex_lock(&w_mutex);  
  8. 寫寫寫……  
  9. pthread_mutex_unlock(&w_mutex);  
  10.   
  11.   
  12. 讀模式:  
  13. pthread_mutex_lock(&r_mutex);           
  14.   
  15. if(readers == 0)  
  16.      pthread_mutex_lock(&w_mutex);  
  17. readers++;  
  18. pthread_mutex_unlock(&r_mutex);   
  19. 讀讀讀……  
  20. pthread_mutex_lock(&r_mutex);  
  21. readers- -;  
  22. if(reader == 0)  
  23.      pthread_mutex_unlock(&w_mutex);  
  24. pthread_mutex_unlock(&r_mutex);   

用信號量來實現讀寫鎖

這裏使用2個信號量+1個整型變量來實現。令信號量的初始數值爲1,那麼信號量的作用就和互斥量等價了。
  1. #include <semaphore.h>     //線程信號量所需頭文件  
  2.   
  3. sem_t r_sem;     //定義信號量  
  4. sem_init(&r_sem, 0, 1);     //初始化信號量   
  5.   
  6. sem_t w_sem;     //定義信號量  
  7. sem_init(&w_sem, 0, 1);     //初始化信號量    
  8. int readers = 0;  
  9.   
  10. 寫模式:  
  11. sem_wait(&w_sem);  
  12. 寫寫寫……  
  13. sem_post(&w_sem);  
  14.   
  15.   
  16. 讀模式:  
  17. sem_wait(&r_sem);  
  18. if(readers == 0)  
  19.      sem_wait(&w_sem);  
  20. readers++;  
  21. sem_post(&r_sem);  
  22. 讀讀讀……  
  23. sem_wait(&r_sem);  
  24. readers- -;  
  25. if(readers == 0)  
  26.      sem_post(&w_sem);  
  27. sem_post(&r_sem);  

發佈了52 篇原創文章 · 獲贊 46 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章