经典同步问题总结

Posted chsobin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典同步问题总结相关的知识,希望对你有一定的参考价值。

一、读者,写者问题

(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 }

 

以上是关于经典同步问题总结的主要内容,如果未能解决你的问题,请参考以下文章

经典线程同步总结 关键段 事件 互斥量 信号量

经典同步问题总结

几个关于js数组方法reduce的经典片段

几个关于js数组方法reduce的经典片段

进程经典问题总结

进程经典问题总结