我很难理解和实现Peterson的N个进程算法(也称为Filter算法)。我正在尝试使用共享内存在C中进行聊天。我使用的是可以在Wikipedia中发现的算法的版本:在聊天中实现Peterson的算法
// 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的值(我会是进程的数量)?
如果我的问题不清楚,请让我知道,因为英语不是我的母语。
非常感谢!
这些结构被认为是在共享内存中,所以这不适用于单独的程序实例,除非您将控制变量所在的区域标记为共享。但是,一旦你这样做,你可以有一个计数器,告诉你有多少并发用户。 –
非常感谢您的回答。实际上,我正在为我的控制变量使用共享内存区域的一部分(我现在正在开发,所以我不知道它是否工作)。我很担心,因为控制变量可以在给定的时间被两个或更多不同的用户同时访问 - 这正是算法试图解决的问题。因此,为了使用该算法知道如何访问共享内存区域,我需要知道共享内存区域中的n的值,并反之亦然:... S –