经典同步问题总结
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 }
以上是关于经典同步问题总结的主要内容,如果未能解决你的问题,请参考以下文章