1

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

问题是:

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

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

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

4

1 回答 1

1

这个例子不是 Algol 68 的正确语法,但很可能是 Algol 68 风格的伪代码。它清楚地包含一些注释,用于解释您可能在算法描述中找到的语句。

在Lindsey 和 Van der Meulen所著的“ Algol 68 的非正式介绍一书中以及Algol 68 修订报告中包含了在 Algol 68 中使用信号量的类似示例。

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

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

因此:

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

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

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


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

于 2016-08-22T22:48:32.620 回答