在大学里,我从“Gregory R. Andrews-Foundations of Multithreaded ....编程”中得到了这个规范的并行编程问题:(虽然我有一本较新的俄语版本的书,我发现了一个古老的英语版本并尝试正确传达一切)
我也被赋予了solve this problem but with m consequently moving cars possible using semaphores的任务。为了解决这个任务,导师告诉我模仿读者的行为来自读者 - 作家任务
单车道桥。来自北方和南方的汽车到达一个 -
车道桥。朝同一方向行驶的汽车可以同时穿过桥梁
时间,但相反方向的汽车不能。
为这个问题制定解决方案。将汽车建模为流程,并使用
监视同步。首先指定监视器不变量,然后开发
监视器的主体。确保公平。 (让汽车摔倒)
我用谷歌搜索并找到了类似任务的解决方案(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
所以我应该使用其中的一些来解决这个问题
答案 0 :(得分:0)
您的显示器onelanebridge距离标记不远,但它没有公平的概念。如果有稳定的北向交通流量,则不会触发向南行的转换。您需要将等待计数和“活动”分开。
一个简单的公平就是交替,所以你可以将'active'计数器限制为1;并检查当它变为零时是否切换。 为避免煽动道路愤怒,您可以根据单车道段的运行时间选择限制。
你现在让车辆在enter_ [ns]中等待有正确的方向,但由于限制必须等待,所以你的if(cond)等待需要变成while(更复杂的cond)等待。
并发编程并不自然,但实践可能会变得根深蒂固。尝试并考虑手头的问题,而不是如何使用这些机制。