在聊天中实现Peterson的算法

时间:2014-04-18 00:00:45

标签: c algorithm memory shared

我很难理解和实施Peterson的N过程算法(也称为过滤算法)。我尝试使用共享内存在C中进行聊天。我使用的算法版本可以在Wikipedia中找到:

// initialization
level[N] = { -1 };     // current level of processes 0...N-1
waiting[N-1] = { -1 }; // the waiting process of each level 0...N-2

// code for process #i
for(l = 0; l < N-1; ++l) {
    level[i] = l;
    waiting[l] = i;
    while(waiting[l] == i && (there exists k ≠ i, such that level[k] ≥ l)) {
        // busy wait
    }
}

// critical section

level[i] = -1; // exit section

我有一个名为server.c的程序和另一个名为client.c的程序,我打算使用该算法,以便每个客户端可以自行访问共享内存。

据我所知,我的算法实现应该在每个客户端内部运行。我的问题是:如果每个客户端都是程序client.c的不同实例,我怎么知道运行的客户端数量(N的值)?另外,如果每个新的client.c实例都不知道之前运行了多少个实例,我怎么知道i的值(我将是进程的数量)?

如果我的问题不清楚,请告诉我,因为英语不是我的母语。

非常感谢!

1 个答案:

答案 0 :(得分:0)

> How do I know the amount of clients running (the value of N)
> if every client is a different instance of the program client.c? 
彼得森的解决方案要求所有参与的进程或线程都可以访问共享内存资源。该共享内存段将包含level []和waiting []数组,以及N的值。

> also, how do I know the value of i (i would be the number of the process)
> if each new instance of client.c is unaware of how many instances have
> been run before?

在存在一定数量的参与进程或线程的更原始的情况下,每个进程都被赋予它'i'的值。唯一的要求是它们是唯一的,并且i> = 0,并且i&lt; N.(也许你的实现可以从命令行参数赋值'i')。

在更高级的实现中,每个进程可能在共享内存段中获取(然后递增)“i”。当然,这样的实现必须确保每个参与者都以不会争用i的方式启动。