您是否需要了解实现临界区和信号量原语的算法?请参阅 进程同步(pdf)。请注意,有时您可能会看到使用临界区实现的信号量,以确保测试修改操作的原子性。
消息队列构建在同步原语之上。您寻找的消息队列位于优秀的信号量小书的第 4 章(pdf ) 的第 4 章中。
编辑添加:
我必须猜测你所说的“邮箱”是什么意思,所以如果这个答案不好,那么定义什么是邮箱会对你有所帮助。我是否理解该练习是通过使用消息队列等高级同步机制来实现 P 和 V?由于必须保护消息队列免受并发问题的影响,因此这是一个简单的练习。
给定一个 Mailbox 类,它保证是线程安全的,并且具有以下方法:
那么信号量类将具有以下方法:
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 是任何消息。它是什么并不重要,因为我们只是使用消息队列来唤醒阻塞的线程。
该算法模拟不能具有负值的信号量。创建具有负值的信号量需要做更多的工作。你需要哪一个?