假设这个问题:2个程序,A和B,A的1个进程,M的M个进程,1个名为var的共享变量
A
main(){
int i, a[50];
for(i=0;i<50;i++)
var = a[i];
}
B
main(){
int i, b[50];
for(i=0;i<50;i++)
b[i] = var;
}
现在,我需要做的是确保对于 A 中的每个循环,每个 M B 进程读取共享变量(一次!)并将其存储在它们的数组中。所以最后每个 B 进程都会在它们的 b 数组中拥有一个 a 数组的副本。这是一个信号量问题,解决方案可以是伪代码,因此语言无关紧要。
一个不起作用的初始解决方案:我正在使用初始化为 0 的信号量 B,每次 A 写一些东西时,我都会将 B 增加 M,然后执行 down(A)。在每个 B 循环开始时,我都会执行 down(B)。然后在 B 的每个循环结束时,我检查 M 阅读器是否读取并存储了 var,如果有,我正在做 up(A)。
显然,以上内容让单个 B 进程“消耗”了所有应该通过 M 个阅读器传播的 M 个用途。那么我如何 - 智能地 - 确保每个 B 只会读取每个 var 一次?一组 M 信号量,每个 M 一个,可以完成这项工作,但这很可能不是练习所要求的。