Chinaunix首页 | 论坛 | 博客
  • 博客访问: 299494
  • 博文数量: 77
  • 博客积分: 394
  • 博客等级: 一等列兵
  • 技术积分: 562
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-19 16:15
文章分类
文章存档

2015年(17)

2014年(1)

2012年(59)

分类:

2012-11-16 15:41:44

原文地址:读者写者编程实例 作者:青竹玉简

  1. 读者优先代码:
  2. #include "stdio.h"  
  3. #include   
  4. #include   
  5.   
  6.   
  7. #define N_WRITER 3 //写者数目  
  8. #define N_READER 5 //读者数目  
  9. #define W_SLEEP  1 //控制写频率  
  10. #define R_SLEEP  1 //控制读频率  
  11.   
  12.   
  13. pthread_t wid[N_WRITER],rid[N_READER];  
  14. const int MAX_RAND = 1000;//产生的最大随机数  
  15. pthread_mutex_t writeLock = PTHREAD_MUTEX_INITIALIZER;//同一时间只能一个人写文件,互斥  
  16. pthread_mutex_t accessReaderCnt = PTHREAD_MUTEX_INITIALIZER;//同一时间只能有一个人访问 readerCnt  
  17. int data = 0;  
  18. int readerCnt = 0;  
  19. void write()  
  20. {  
  21.     int rd = rand();  
  22.     printf("write %d\n",rd);  
  23.     data = rd;  
  24. }  
  25. void read()  
  26. {  
  27.     printf("read %d\n",data);  
  28. }  
  29. void * writer(void * in)  
  30. {  
  31.     while(1)  
  32.     {  
  33.         pthread_mutex_lock(&writeLock);  
  34.         write();  
  35.         pthread_mutex_unlock(&writeLock);  
  36.         sleep(W_SLEEP);  
  37.     }  
  38.     pthread_exit((void *) 0);  
  39. }  
  40.   
  41. void * reader (void * in)  
  42. {  
  43.     while(1)  
  44.     {  
  45.         pthread_mutex_lock(&accessReaderCnt);  
  46.         readerCnt++;  
  47.         if(readerCnt == 1){  
  48.             pthread_mutex_lock(&writeLock);  
  49.         }  
  50.         pthread_mutex_unlock(&accessReaderCnt);  
  51.           
  52.         read();  
  53.           
  54.         pthread_mutex_lock(&accessReaderCnt);  
  55.         readerCnt--;  
  56.         if(readerCnt == 0){  
  57.             pthread_mutex_unlock(&writeLock);  
  58.         }  
  59.         pthread_mutex_unlock(&accessReaderCnt);  
  60.         sleep(R_SLEEP);  
  61.     }  
  62.     pthread_exit((void *) 0);  
  63. }  
  64.   
  65. int main()  
  66. {  
  67.     int i = 0;  
  68.     for(i = 0; i < N_READER; i++)  
  69.     {  
  70.         pthread_create(&wid[i],NULL,reader,NULL);  
  71.     }  
  72.     for(i = 0; i < N_WRITER; i++)  
  73.     {  
  74.         pthread_create(&rid[i],NULL,writer,NULL);  
  75.     }  
  76.     while(1){  
  77.         sleep(10);  
  78.     }  
  79.     return 0;  
  80. }  
  81. 写者优先代码如下:
  82. #include "stdio.h"  
  83. #include   
  84. #include   
  85.   
  86.   
  87. #define N_WRITER 2 //写者数目  
  88. #define N_READER 20 //读者数目  
  89. #define W_SLEEP 1 //控制写频率  
  90. #define R_SLEEP  0.5 //控制读频率  
  91.   
  92.   
  93. pthread_t wid[N_WRITER],rid[N_READER];  
  94. const int MAX_RAND = 1000;//产生的最大随机数  
  95. int data = 0;  
  96. int readerCnt = 0, writerCnt = 0;  
  97. pthread_mutex_t accessReaderCnt = PTHREAD_MUTEX_INITIALIZER;  
  98. pthread_mutex_t accessWriterCnt = PTHREAD_MUTEX_INITIALIZER;  
  99. pthread_mutex_t writeLock = PTHREAD_MUTEX_INITIALIZER;  
  100. pthread_mutex_t readerLock = PTHREAD_MUTEX_INITIALIZER;  
  101. pthread_mutex_t outerLock = PTHREAD_MUTEX_INITIALIZER;  
  102.   
  103. void write()  
  104. {  
  105.     int rd = rand()%MAX_RAND;  
  106.     printf("write %d\n",rd);  
  107.     data = rd;  
  108. }  
  109. void read()  
  110. {  
  111.     printf("read %d\n",data);  
  112. }  
  113. void * writer(void * in)  
  114. {  
  115.     while(1)  
  116.     {  
  117.         pthread_mutex_lock(&accessWriterCnt);  
  118.         {//临界区,希望修改 writerCnt,独占 writerCnt  
  119.             writerCnt++;  
  120.             if(writerCnt == 1){  
  121.                 //阻止后续的读者加入待读队列  
  122.                 pthread_mutex_lock(&readerLock);  
  123.             }  
  124.         }  
  125.         pthread_mutex_unlock(&accessWriterCnt);  
  126.           
  127.           
  128.         pthread_mutex_lock(&writeLock);  
  129.         {//临界区,限制只有一个写者修改数据  
  130.             write();  
  131.         }  
  132.         pthread_mutex_unlock(&writeLock);  
  133.           
  134.         pthread_mutex_lock(&accessWriterCnt);  
  135.         {//临界区,希望修改 writerCnt,独占 writerCnt  
  136.             writerCnt--;  
  137.             if(writerCnt == 0){  
  138.                 //阻止后续的读者加入待读队列  
  139.                 pthread_mutex_unlock(&readerLock);  
  140.             }  
  141.         }  
  142.         pthread_mutex_unlock(&accessWriterCnt);  
  143.         sleep(W_SLEEP);  
  144.     }  
  145.     pthread_exit((void *) 0);  
  146. }  
  147.   
  148. void * reader (void * in)  
  149. {  
  150.     while(1)  
  151.     {  
  152.         //假如写者锁定了readerLock,那么成千上万的读者被锁在这里  
  153.         pthread_mutex_lock(&outerLock);  
  154.         {//临界区  
  155.             pthread_mutex_lock(&readerLock);//只被一个读者占有  
  156.             {//临界区  
  157.                 pthread_mutex_lock(&accessReaderCnt);//代码段 1  
  158.                 {//临界区  
  159.                     readerCnt++;  
  160.                     if(readerCnt == 1){  
  161.                         pthread_mutex_lock(&writeLock);  
  162.                     }  
  163.                 }  
  164.                 pthread_mutex_unlock(&accessReaderCnt);  
  165.             }  
  166.             pthread_mutex_unlock(&readerLock);//释放时,写者将优先获得readerLock  
  167.         }  
  168.         pthread_mutex_unlock(&outerLock);  
  169.   
  170.         read();  
  171.           
  172.         pthread_mutex_lock(&accessReaderCnt);//代码段2  
  173.         {//临界区  
  174.             readerCnt--;  
  175.             if(readerCnt == 0){  
  176.                 pthread_mutex_unlock(&writeLock);//在最后一个并发读者读完这里开始禁止写者执行写操作  
  177.             }  
  178.         }  
  179.         pthread_mutex_unlock(&accessReaderCnt);  
  180.           
  181.         sleep(R_SLEEP);  
  182.     }  
  183.     pthread_exit((void *) 0);  
  184. }  
  185.   
  186. int main()  
  187. {  
  188.     int i = 0;  
  189.     for(i = 0; i < N_READER; i++)  
  190.     {  
  191.         pthread_create(&rid[i],NULL,reader,NULL);  
  192.     }  
  193.     for(i = 0; i < N_WRITER; i++)  
  194.     {  
  195.         pthread_create(&wid[i],NULL,writer,NULL);  
  196.     }  
  197.     while(1){  
  198.         sleep(10);  
  199.     }  
  200.     return 0;  

阅读(1118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~