如何通过消息传递模拟信号量......?

Her*_*ero 5 algorithm

我想用仅以算法(而不是代码)的形式传递的消息来模拟信号量(等待和信号过程)。

谁能帮我...?

Way*_*rad 2

您是否需要了解实现临界区和信号量原语的算法?请参阅 进程同步(pdf)。请注意,有时您可能会看到使用临界区实现的信号量,以确保测试修改操作的原子性。

消息队列构建在同步原语之上。您寻找的消息队列位于优秀的信号量小书的第 4 章(pdf ) 的第 4 章中。

编辑添加:

我必须猜测你所说的“邮箱”是什么意思,所以如果这个答案不好,那么定义什么是邮箱会对你有所帮助。我是否理解该练习是通过使用消息队列等高级同步机制来实现 P 和 V?由于必须保护消息队列免受并发问题的影响,因此这是一个简单的练习。

给定一个 Mailbox 类,它保证是线程安全的,并且具有以下方法:

  • enqueue(message) - 将消息添加到邮箱。如果有任何线程在出队时被阻塞,则唤醒其中一个。
  • dequeue - 从邮箱中删除消息,如果邮箱为空则阻塞。

那么信号量类将具有以下方法:

initialize(count):
  mailbox = Mailbox.new
  count.times do
    v

v:
  mailbox.enqueue(any_message)

p:
  mailbox.dequeue
Run Code Online (Sandbox Code Playgroud)

any_message 是任何消息。它是什么并不重要,因为我们只是使用消息队列来唤醒阻塞的线程。

该算法模拟不能具有负值的信号量。创建具有负值的信号量需要做更多的工作。你需要哪一个?