使用监视器的单车道桥

2024-04-25

在大学里,我从“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  

所以我应该使用其中的一些来解决这个任务


你的显示器 onelanebridge 并没有偏离目标,但它没有公平的概念。如果有源源不断的北行交通,就不会触发南行交通。您需要将等待计数和“活动”计数分开。

一个简单的公平就是交替进行,因此您可以将“活动”计数器限制为 1;并检查当变为零时是否切换。 为避免引发路怒症,您可以根据单车道路段的通行时间选择限制。

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

并发编程并不自然,但通过练习可以变得根深蒂固。尝试思考当前的问题,而不是如何使用这些机制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用监视器的单车道桥 的相关文章

  • 使用 Golang 通道处理 HTTP 请求

    我正在尝试构建一个简单的 Golang Appengine 应用程序 它使用通道来处理每个 http 请求 原因是我希望每个请求执行合理的大型内存计算 并且每个请求都以线程安全的方式执行 即来自并发请求的计算不会混合 这一点很重要 本质上
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • C# 中的监视器与互斥体[重复]

    这个问题在这里已经有答案了 可能的重复 C 中各种线程同步选项之间有什么区别 https stackoverflow com questions 301160 what are the differences between various
  • LegacyUnhandledExceptionPolicy 不允许捕获(并吞下)ThreadAbortException?

    我正在使用 NET 1 1 兼容模式来处理未处理的异常 问题是 当 LegacyUnhandledExceptionPolicy 设置为 1 这就是我想要的 时 我无法捕获并吞下 ThreadAbortException 示例代码 应用程序
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 如何通过pthreads管理两个或多个消费者?

    我有一个正在寻求解决的通用问题 即从标准输入或常规文件流发送到应用程序的二进制数据块 应用程序又将二进制数据转换为文本 使用线程 我想在将文本传输到下一个应用程序之前对其进行处理 该应用程序会进一步修改该文本 依此类推 作为一个简单的测试用
  • Pygame - 如何使 hitbox 与敌人的移动一起工作?

    我正在用 Pygame 制作一个 Python 游戏 目前正在研究 hitbox 程序应该暂停 设置play False 每当玩家与敌人碰撞时 只有当我注释掉所有敌人的移动 第 56 64 行 时它才 有效 但这显然不是最好的选择 我读过有
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • 在Java中,如何在每次进入或退出给定对象的监视器时记录一条消息?

    我正在尝试调试一些使用一些自定义引用计数 锁定的 C Java 绑定 我想让 JVM 在每次给定对象进入或退出其监视器时打印一条消息 有什么办法可以做到这一点吗 基本上 我想要这个 synchronized lock System out
  • 无锁算法中的 ABA

    我明白了ABA http en wikipedia org wiki ABA problem问题 但我无法理解的是 他们说在语言中自动垃圾收集它可能不会展示 所以我的问题是 自动垃圾收集如何防止ABA问题的发生 在java中是否可能 如果可
  • 编写潜在并发问题的证明

    我正在阅读 Java 并发实践 并尝试编写一段代码来表明第 3 5 1 章中作为示例提供的类确实会引入问题 public class Holder public int n public Holder int n this n n publ
  • 双重检查锁定模式

    In 有伪代码来正确实现作者建议的模式 见下文 Singleton Singleton instance Singleton tmp pInstance insert memory barrier 1 if tmp 0 Lock lock
  • 从 foreach 循环赋值

    我想并行化一个循环 例如 td lt data frame cbind c rep 1 4 2 rep 1 5 rep 1 10 2 names td lt c val id res lt rep NA NROW td for i in l
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • 硬件线程与软线程?

    我读过 在多核处理器中 每个核心包含 2 个硬件线程 例如在双核处理器中 有 4 个硬件线程正在运行 现在 如果我在 Java 中创建 2 个线程 这些线程是否会映射到 2 个硬件线程 或者这 2 个 Java 线程由特定核心的单个硬件线程
  • 判断线程是否已经启动

    如何判断Python线程是否已经启动 有一个方法is alive 但这是真的before and while一个线程正在运行 你可以看看ident领域的Thread实例 这Python 2 7 线程文档 http docs python o
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • 使用 SQL Server 作为具有多个客户端的数据库队列

    给定一个充当队列的表 如何最好地配置表 查询 以便多个客户端同时处理队列 例如 下表指示了工作人员必须处理的命令 当worker完成后 它会将处理后的值设置为true ID COMMAND PROCESSED 1 true 2 false
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th

随机推荐