假设有这样一个问题:
有2个程序,A和B,1个A的进程,M个B的进程,1个名为var的共享变量。
现在,我需要做的是确保A中的每个循环中,每个M个B进程只读取共享变量(一次!)并将其存储在它们的数组中。因此最终,每个B进程都将在其b-arrays中拥有a-array的副本。 这是一个信号量问题,解决方案可以是伪代码,所以语言不重要。
一个初始的解决方案,但并没有起作用: 我使用了一个初始化为0的信号量B,每当A写入时,我就通过M增加B,并进行down(A)。 在每个B循环开始时,我执行down(B)。然后在每个B循环结束时,我检查是否有M个读者已经读取并存储了var,如果有,我就执行up(A)。
显然,上述方法让单个B进程“消耗”了应该分配给M个读者的所有M次使用。 那么,我如何聪明地确保每个B仅读取每个变量一次?一个M个信号量的数组,每个M一个信号量,可以完成任务,但很可能不是这个练习要求的。
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-arrays中拥有a-array的副本。 这是一个信号量问题,解决方案可以是伪代码,所以语言不重要。
一个初始的解决方案,但并没有起作用: 我使用了一个初始化为0的信号量B,每当A写入时,我就通过M增加B,并进行down(A)。 在每个B循环开始时,我执行down(B)。然后在每个B循环结束时,我检查是否有M个读者已经读取并存储了var,如果有,我就执行up(A)。
显然,上述方法让单个B进程“消耗”了应该分配给M个读者的所有M次使用。 那么,我如何聪明地确保每个B仅读取每个变量一次?一个M个信号量的数组,每个M一个信号量,可以完成任务,但很可能不是这个练习要求的。