在大学里,我从“Gregory R. Andrews-Foundations of Multithreaded ....programming”中得到了这个规范的并行编程问题:(虽然我有这本书的较新版本和俄语版本,但我发现了一个旧的英语变体并尝试正确传达一切)
我还被赋予了任务解决这个问题,但因此可以使用信号量移动汽车 https://stackoverflow.com/questions/47612370/one-lane-bridge-using-semaphores为了解决该任务,导师告诉我模仿读者-作者任务中读者的行为
单车道桥。从北方和南方来的汽车到达一个——
车道桥。往同一方向行驶的汽车可以同时过桥
时间,但朝相反方向行驶的汽车则不能。
制定解决此问题的方案。将汽车建模为流程,并使用
监控同步。首先指定监控不变量,然后开发
确保公平性。 (让汽车转弯)
我用谷歌搜索并找到了类似任务的解决方案(http://www.cs.cornell.edu/courses/cs4410/2008fa/homework/hw3_soln.pdf http://www.cs.cornell.edu/courses/cs4410/2008fa/homework/hw3_soln.pdf)但讲师说大部分都是无用且不正确的我最终得到了以下解决方案:
monitor onelanebridge{
int nb=0,sb=0; //Invar:(nb==0 and sb<=1)or(sb=0 and nb<=1)
cond nbfreetogo,sbfreetogo; //conditional variables
procedure enter_n(){
if(sb!=0andnb==0) wait(nbfreetogo);
nb++;
}
procedure enter_s(){
if(nb!=0andsb==0) wait(sbfreetogo);
sb++;
}
procedure leave_n(){
nb--;
if(nb==0) signal(sbfreetogo);
}
procedure leave_s(){
sb--;
if(sb==0) signal(nbfreetogo);
}
}
有人问我这样的问题:“什么确保一次不能超过一辆车过桥?”..我什至不确定是否是这样...请帮助我正确解决任务。我必须只使用上述书中的结构......
书中读者-作者问题解决方案的示例:
monitor RW_Controller {
int nr = 0, nw =0; //Invar: (nr == 0 or nw == 0) and nw <= 1
cond oktoread; # recieves signal, when nw == 0
cond oktowrite; # recieves signal, when nr == 0 и nw == 0
procedure request_read() {
while (nw > 0) wait(oktoread);
nr = nr + 1;
}
procedure release_read() {
nr = nr - 1;
if (nr == 0) signal(oktowrite);
# run one writer-process
}
procedure request_write() {
while (nr > 0 || nw > 0) wait(oktowrite);
nw = nw + 1 ;
}
procedure release_ write() {
nw = nw - 1;
signal(oktowrite); # run one writer-process and
signal_all(oktoread); # all reader-processes
}
}
当然我的解决方案只是随机尝试。请阻止我正确解决任务
注意:根据书中的“条件变量”类型的变量是一个“等待队列”,它具有以下方法:
wait(cv)//wait at end of queue
wait(cv,rank)//wait in order of increasing value of rank
signal(cv)//awaken process at end of queue then continue
signal_all(cv)//awaken all processes at end of queue then continue
empty(cv) //true if wait queue is empty; false otherwise
minrank(cv) //value of rank of process at front of wait queue
所以我应该使用其中的一些来解决这个任务