gpt4 book ai didi

multithreading - 使用监视器的一车道桥

转载 作者:行者123 更新时间:2023-12-03 13:08:38 39 4
gpt4 key购买 nike

在大学中,我从“Gregory R. Andrews-多线程....编程基础”中得到了规范的并行编程问题:(尽管我有一本书的较新和俄语版本,但我发现了一个旧的英语变体,并尝试正确传达一切)
我还被赋予solve this problem but with m consequently moving cars possible using semaphores任务。为了解决该任务,导师告诉我要模仿读者-作家任务中的读者行为
单车桥。 来自北方和南方的汽车到达一个
车道桥。朝相同方向行驶的汽车可以在同一时间过桥
时间,但是朝相反方向行驶的汽车却不能。
制定此问题的解决方案。将汽车建模为流程,并使用
监视同步。首先指定监视器不变式,然后开发
显示器主体,确保公平。 (有车上车)
我在Google上搜索并找到了类似任务的解决方案(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

所以我应该使用其中一些解决任务

最佳答案

您的显示器onelanebridge距离目标不远,但是没有公平的概念。如果有稳定的北行流量,则不会触发向南行的切换。您需要将等待和“活跃”计数分开。

一个简单的公平方法是交替进行,因此您可以将“ Activity ”计数器限制为1;并检查是否为零时进行切换。
为避免激怒道路,您可以根据单车道路段的穿越时间选择一个限制。

现在,您将在具有正确方向的enter_ [ns]中等待车辆,但由于限制而必须等待,因此您的if(cond)等待需要变为while(更复杂的cond)等待。

并发编程不是自然的,但是随着实践的发展,它会变得根深蒂固。尝试并思考当前的问题,而不是如何运用这些机制。

关于multithreading - 使用监视器的一车道桥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613297/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com