使用二进制信号量来构建计数信号量

时间:2016-06-05 13:07:45

标签: semaphore algol68

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

问题是:

  

这是用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.
     

通过使用二进制信号量写一个up,down原语,它建立在一个计数信号量之上(如例子)。

     

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

1 个答案:

答案 0 :(得分:0)

这个例子不是Algol 68的正确语法,但很可能是Algol 68样式的伪代码。它显然包含一些注释,可以解释您在算法描述中可能找到的语句。

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

您不会在Algol 68中编写向上向下原语,因为它们已经在提供的语言中以原语实现。信号量操作的不可分割的原子性质要求它们被内置。自己实现它们会使它们变得非原子化和不间断,使它们无法用作操作信号量!然而,学习这样一个原始内容是教学的。

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

因此:

  

sem 信号量; ¢声明包含整数的信号量¢
    信号量:= 级别 9; ¢将信号量内的整数初始化为9¢
的值   向上 信号量; ¢信号量内的整数增加一个¢
  向下 信号量; ¢信号量内的整数减1¢    int := 级别 信号量; ¢提取信号量中包含的整数值¢

因此,您引用的文字被错误翻译。应该说所显示的算法是描述Algol 68中的信号量运算符如何运行。它不是Algol 68的一部分,而是解释运营商向上向下实际上做了什么。您不会被要求在Algol 68中实现它们,而是以其他语言实现它们作为示例来演示它们的工作原理。 Algol 68已经包含计数信号量。其他一些语言(不是Algol 68)将包含二进制信号量。

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

我之前会回答,但忘了检查标签!