如何使用消息传递模拟信号量?

时间:2009-12-31 21:21:48

标签: algorithm

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

任何人都可以帮助我......?

1 个答案:

答案 0 :(得分:2)

您是否需要了解实现关键部分和信号量原语的算法?见Process Synchronization(pdf)。请注意,有时您可能会看到使用关键部分实现的信号量,以确保测试 - 修改操作的原子性。

消息队列建立在同步原语之上。您寻求的消息队列位于优秀Little Book of Semaphorespdf)的第4章中。

已编辑添加:

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

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

  • enqueue(message) - 向邮箱添加邮件。如果出列时有任何线程被阻止,请将其唤醒。
  • dequeue - 从邮箱中删除邮件,如果邮箱为空则阻止。

然后信号量类会有这些方法:

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

v:
  mailbox.enqueue(any_message)

p:
  mailbox.dequeue

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

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