我正在尝试解决“多线程、并行和分布式编程基础”一书的练习 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时,它做stamp[pos] - 1。所以,如果 stamp[pos] 为零,则消息缓冲区[pos] 已被读取 N 次,并且写入者可以再次在该位置写入。
但是,如果一些读者阅读了一条消息两次(或更多),作者可以在位置 pos 写入一条新消息,而一些读者将不会阅读旧消息。