读写锁

  读写锁是多线程同步中的一个很有用的东东,区分开读者和写者,有助于效率的提升。

    就好像是一个签名簿,写者相当于签名的人,读者相当于看签名簿的人,写签名簿的一群人需要排队,一个一个地签名,而读者不需要排队,他们可以一起看。当一群围观的正在看时,匆匆忙忙跑来一个签名的,大喊“让开,我要迟到了,让我签到”,于是大家让开让他签了名子,这说明了什么?

    1.写者比读者优先级高,同时竞争读写锁的话,写者将获得锁。

    2.写者必须一个一个地获得锁

    3.而一群读者可以同时获得读写锁。

 

下面一段程序说明了这个道理。


                                     编译:   gcc -o a rwlock.c -lpthread

                                     运行:   ./a

 

C代码   收藏代码
  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #include <stdlib.h>  
  4.   
  5. #define THREADCNT 10  
  6.   
  7. pthread_rwlock_t rwlock;                                                  //建立读写锁  
  8. int global_var =  1;  
  9.   
  10. void* reader(void* pvoid)  
  11. {  
  12.         pthread_rwlock_rdlock(&rwlock);                               //读方式获取锁  
  13.         sleep(1);  
  14.         printf("reader %d worked. global_var = %d\n", (int)pvoid, global_var);  
  15.         if(pthread_rwlock_unlock(&rwlock)) {  
  16.                 printf("reader %d unlock error!\n", (int)pvoid);  
  17.         }  
  18.         return NULL;  
  19. }  
  20. void* writer(void* pvoid)  
  21. {  
  22.         pthread_rwlock_wrlock(&rwlock);                               //写方式获得锁  
  23.         sleep(1);  
  24.         printf("writer %d worked. global_var = %d\n", (int)pvoid, global_var++);  
  25.         if(pthread_rwlock_unlock(&rwlock)) {  
  26.                 printf("writer %d unlock error!\n", (int)pvoid);  
  27.         }  
  28.         return NULL;  
  29. }  
  30. int main()  
  31. {  
  32.         pthread_t reader_id, writer_id;  
  33.         pthread_attr_t threadattr;  
  34.         int i, rand;  
  35.         int readercnt = 1, writercnt = 1;  
  36.         int halfmax = RAND_MAX / 2;  
  37.         if(pthread_rwlock_init(&rwlock, NULL)) {                     //初始化读写锁  
  38.                 printf("initialize rwlock error!\n");  
  39.         }  
  40.         pthread_rwlock_wrlock(&rwlock);  
  41.         pthread_attr_init(&threadattr);  
  42.         pthread_attr_setdetachstate(&threadattr, PTHREAD_CREATE_DETACHED);  
  43.         for(i = 0; i < THREADCNT; i++) {  
  44.                 rand = random();  
  45.                 if(rand < halfmax) {  
  46.                         pthread_create(&reader_id, &threadattr, reader,  
  47.                                                 (void*)readercnt);  
  48.                         printf("Created reader %d\n", readercnt++);  
  49.                 } else {  
  50.                         pthread_create(&writer_id, &threadattr, writer,  
  51.                                                 (void*)writercnt);  
  52.                         printf("Created writer %d\n", writercnt++);  
  53.                 }  
  54.         }  
  55.         pthread_rwlock_unlock(&rwlock);  
  56.         pthread_exit(0);  
  57.         return 0;  
  58. }  
  59.    

 

运行结果:

 

C代码   收藏代码
  1. Created writer 1  
  2. Created reader 1  
  3. Created writer 2  
  4. Created writer 3  
  5. Created writer 4  
  6. Created reader 2  
  7. Created reader 3  
  8. Created writer 5  
  9. Created reader 4  
  10. Created writer 6  
  11. writer 3 worked. global_var = 1  
  12. writer 4 worked. global_var = 2  
  13. writer 5 worked. global_var = 3  
  14. writer 2 worked. global_var = 4  
  15. writer 6 worked. global_var = 5  
  16. writer 1 worked. global_var = 6  
  17. reader 2 worked. global_var = 7  
  18. reader 3 worked. global_var = 7  
  19. reader 4 worked. global_var = 7  
  20. reader 1 worked. global_var = 7 

你可能感兴趣的:(读写锁)