码迷,mamicode.com
首页 > 其他好文 > 详细

【经典同步问题总结】

时间:2018-11-21 10:58:03      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:span   问题   释放   semaphore   保护   int   问题:   --   第一个   

一、读者,写者问题

(1)当写者在执行写操作时,不允许其他写者和读者操作共享变量

(2)允许多个读者同时进行操作

解法一:读者优先

存在的问题:如果有一个读者线程在读,那么之后如果同时来了读线程和写线程,读线程会优先执行

      可能会导致写线程长时间等待。

 1 int count=0; //用于记录当前的读者数量
 2 semaphore mutex=1; //用于保护更新count变量时的互斥
 3 semaphore rw=1; //用于保证读者和写者互斥地访问文件
 4  
 5 // 写者线程
 6 writer () { 
 7     while (1){
 8           P(rw);   // 互斥访问共享变量
 9           Writing; // 写操作
10           V(rw) ;  // 释放对共享变量的占有
11       }
12 }
13 
14 // 读者线程
15 reader () { 
16     while(1){
17         P(mutex) ;   //互斥访问count变量
18          if(count==0) //当第一个读进程读共享文件时
19             P(rw);   //阻止写进程写
20          count++;     //读者计数器加1
21          V(mutex);    //释放互斥变量count
22          
23          reading; //读操作
24          
25          P(mutex);   //互斥访问count变量
26          count--;     //读者计数器减1
27          if(count==0) //当最后一个读进程读完共享文件
28              V(rw);       //允许写进程写
29          V(mutex);  //释放互斥变量 count
30      }
31 }

解法二:写者优先

 1 int count = 0; //用于记录当前的读者数量
 2 semaphore mutex = 1; //用于保护更新count变量时的互斥
 3 semaphore rw=1; //用于保证读者和写者互斥地访问文件
 4 semaphore w=1; //用于实现“写优先”
 5 
 6 writer(){
 7     while(1){
 8         P(w);    //在无写进程请求时进入
 9         P(rw);   
10         writing; 
11         V(rw);   
12         V(w);   //恢复对共享支件的访问
13     }
14 }
15 reader(){
16     while(1){
17         P(w);       // 在无写进程请求时进入
18         P(mutex); 
19         if(count==0) 
20             P(rw); 
21         count++; 
22         V(mutex); 
23         V(w);       // 恢复对共享文件的访问
24         
25         reading; 
26         
27         P(mutex); 
28         count--; 
29         if(count==0) 
30             V(rw);   
31         V(mutex);
32     }
33 }

 

【经典同步问题总结】

标签:span   问题   释放   semaphore   保护   int   问题:   --   第一个   

原文地址:https://www.cnblogs.com/chsobin/p/9993528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!