原子广播练习

时间:2013-06-27 14:07:38

标签: parallel-processing monitor concurrent-programming

我正在努力解决本书的练习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位置发送一条新消息,而某些读者则不会阅读旧消息。

0 个答案:

没有答案