0

我正在尝试解决“多线程、并行和分布式编程基础”一书的练习 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 写入一条新消息,而一些读者将不会阅读旧消息。

4

0 回答 0