我正在努力解决本书的练习5.10 “多线程,并行和分布式编程的基础”。
练习
“假设一个生产者进程和N个消费者进程共享一个有B个槽的有界缓冲区。生产者将消息存入缓冲区;消费者获取它们。生产者存放的每条消息都将被所有N个消费者接收。消费者将按照存放的顺序接收消息。但是,消费者可以在不同的时间接收消息。例如,如果第二个消费者很慢,一个消费者可以接收多于B个消息。 开发一种实现这种通信的监视器。使用信号和继续纪律。“
有人可以帮助我吗?
非常感谢!
- 编辑:
我正在评论我已经做过的事情(因为我认为如果我写了所有内容,问题就很大了。)
/* creating a buffer of B positions. */
global buffer[B];
Monitor {
cond ok_write;
cond ok_read;
int stamp_buffer[B] = [0, 0, .., 0]
request_write (int pos){
if (stamp_buffer[pos] > 0)
wait(ok_write);
write_message (buufer[pos]);
stamp_buffer[pos] = N;
signalAll (ok_read);
}
request_read (int pos){
if (stamp_buffer[pos] == 0)
wait (ok_read);
stamp_buffer[pos] --;
}
release_read (int pos){
if (stamp_buffer[pos]==0)
signal(ok_write);
}
}
所以,我认为我仍然有这个问题:“读者可以阅读相同的消息两次。”
我的算法的基本思想是: 作者写一个位置“pos”并将stamp [pos]的值设置为N. 然后,当每个读者读取位置pos时,它会标记[pos] - 1。 因此,如果stamp [pos]为零,则消息缓冲区[pos]已经被重新加载了N次,并且编写者可以再次写入此位置。
但是,如果某些读者阅读了两次(或更多)的消息,则作者可以在pos位置发送一条新消息,而某些读者则不会阅读旧消息。