【问题标题】:using binary semaphore to build counting semaphore使用二进制信号量构建计数信号量
【发布时间】:2016-06-05 13:07:45
【问题描述】:

我正在研究信号量。书中有一个问题没有答案,我很想知道如何解决这个问题。

问题是:

这是一个用 Algol68 编写的计数信号量:

Down mutex: if mutex = 0 then access is blocked
                            else mutex := mutex -1
Up mutex: mutex := mutex + 1, restart  program
                            which blocked because of mutex.

通过使用二进制信号量编写一个向上、向下的原语,该原语建立在计数信号量之上(如示例)。

在计数信号量中使用两个二进制信号量变量和一个静态变量。

【问题讨论】:

    标签: semaphore algol68


    【解决方案1】:

    此示例的语法不适合 Algol 68,但很可能是 Algol 68 样式的伪代码。它显然包含一些 cmet,用于解释您可能在算法描述中找到的语句。

    "An Informal Introduction to Algol 68" by Lindsey and Van der MeulenAlgol 68 Revised Report 一书中包含在 Algol 68 中使用信号量的类似示例。

    您不会在 Algol 68 中编写 updown 原语,因为它们已经在提供的语言中作为原语实现。信号量操作的不可分割的原子性质需要内置它们。自己实现它们将使它们成为非原子和不间断的,使它们作为操作信号量无用!然而,了解这样一个原始的内部是什么是有指导意义的。

    Algol 68 使用 sema 声明以及所讨论的 updown 操作提供信号量声明。它还提供了它们可以在其中操作的并行子句,这些子句由 par 符号和逗号 , 分隔符指示。 (分号; 用于顺序、非并行操作)。

    因此:

    sem 信号量; ¢ 声明包含整数的信号量 ¢
    信号量 := level 9; ¢ 将信号量内的整数初始化为 9 ¢
    up semaphore; ¢ 信号量内的整数加一¢
    down 信号量; ¢ 信号量内的整数减一 ¢
    int value := level semaphore; ¢ 提取信号量中包含的整数的值 ¢

    因此,您引用的文本翻译不正确。应该说显示的算法是Algol 68 中信号量运算符如何工作的描述。它不是 Algol 68 的一部分,而是对运算符 updown 实际执行的操作的解释。您不需要在 Algol 68 中实现它们,而是以其他语言实现它们作为示例来演示它们是如何工作的。 Algol 68 已经包含计数信号量。其他一些语言(不是 Algol 68)将包含二进制信号量。

    由于描述中的算法非常明确,因此编码应该不难。如果您已经指出代码应该以哪种语言显示(包含二进制信号量),我们可以提供帮助!您误译并误解了您的书要求您做什么。


    我会早点回答,但忘了检查标签!

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2011-07-29
      • 2015-11-16
      • 1970-01-01
      • 2015-07-03
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      相关资源
      最近更新 更多