System and device programming——R&W with semaphore
2016-03-14 16:19
543 查看
https://en.wikipedia.org/wiki/Readers%E2%80%93writers_problem
(3 cases including fairness)
Readers Precedence
when both readers and writers wait,favor readers and writers can write only after all readers read.Using semaphore me1 to let writer need to wait one more signal.e.g.when
writer w1 enters and no readers,w1 can write,then have both writers and readers are waiting. Reader r1 can continue till wait(w),but writer w2 can't enter because it needs w1
completes to release semaphore(me1).After w1 finishes writing,it releases semaphore w first,then reader r1 gets immediately. Then reader r1 increases counter,and release semaphore me later which can let next reader increases counter,in this way till last reader
finishes reading and decreases(nr==0) counter,semaphore w can only be released.Only after this,can writer gets semaphore w and writes.
nr=0(number of readers currently reading)
int(w)=int(me)=int(me1)=1
Reader Writer
wait(me); wait(me1)
nr++; wait(w)
if(nr==1) wait(w) ...
signal(me) //writing
... ...
//reading signal(w)
... signal(me1)
wait(me)
nr--;
if(nr==0) signal(w)
signal(me)
Writers Precedence
The use of me2 is same with previous case
nr=nw=0;init(r)=init(w)=init(me)=init(me1)=init(me2)=1
Reader Writer
wait(me2) wait(me1)
wait(r) nw++
//needs to see whether there's writer if(nw==1) wait(r)
//waiting,previous only first reader needs to check signal(me1)
//and checks only writing wait(w)
wait(me) .
nr++ .
if(nr==1) wait(w) //Writing
signal(me) .
signal(r) .
signal(me2) signal(w)
//Reading wait(me1)
wait(me) nw--
nr-- if(nw==0)signal(r)
if(nr==0) signal(w) signal(me1)
signal(me2)
when no precedence for both readers and writers,but first in,first served,what to do?
maybe list
(3 cases including fairness)
Readers Precedence
when both readers and writers wait,favor readers and writers can write only after all readers read.Using semaphore me1 to let writer need to wait one more signal.e.g.when
writer w1 enters and no readers,w1 can write,then have both writers and readers are waiting. Reader r1 can continue till wait(w),but writer w2 can't enter because it needs w1
completes to release semaphore(me1).After w1 finishes writing,it releases semaphore w first,then reader r1 gets immediately. Then reader r1 increases counter,and release semaphore me later which can let next reader increases counter,in this way till last reader
finishes reading and decreases(nr==0) counter,semaphore w can only be released.Only after this,can writer gets semaphore w and writes.
nr=0(number of readers currently reading)
int(w)=int(me)=int(me1)=1
Reader Writer
wait(me); wait(me1)
nr++; wait(w)
if(nr==1) wait(w) ...
signal(me) //writing
... ...
//reading signal(w)
... signal(me1)
wait(me)
nr--;
if(nr==0) signal(w)
signal(me)
Writers Precedence
The use of me2 is same with previous case
nr=nw=0;init(r)=init(w)=init(me)=init(me1)=init(me2)=1
Reader Writer
wait(me2) wait(me1)
wait(r) nw++
//needs to see whether there's writer if(nw==1) wait(r)
//waiting,previous only first reader needs to check signal(me1)
//and checks only writing wait(w)
wait(me) .
nr++ .
if(nr==1) wait(w) //Writing
signal(me) .
signal(r) .
signal(me2) signal(w)
//Reading wait(me1)
wait(me) nw--
nr-- if(nw==0)signal(r)
if(nr==0) signal(w) signal(me1)
signal(me2)
when no precedence for both readers and writers,but first in,first served,what to do?
maybe list
相关文章推荐
- SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(中)
- SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(上)
- SqlServer应用之sys.dm_os_waiting_tasks 引发的疑问(下)
- tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError:)
- 保持长时间的ssh连接
- Windows Live Writer发博客样式不能预览问题(求解决)
- java基础之java I/O框架(二)
- 文章标题
- windows live writer 安装配置以及发布文章
- IO--ReaderAndWriter
- 游戏提交已14天,状态仍是waiting for review,谁比我更惨
- File Target Writer
- Java_多线程_线程状态
- fastboot 卡在 waiting for device
- ExtJS学习03
- 黑马程序员_IO流(一)
- Java Thread BLOCKED和WAITING两种状态的区别(英)
- 1014. Waiting in Line (30)
- 黑马程序员_java_IO流_FileWriter_FileReader_BufferedWriter_BufferedReader_IO异常
- 用Live Writer写博文插入程序代码的三个插件比较