【发布时间】:2013-01-18 07:24:02
【问题描述】:
假设这个问题: 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 一个信号量,可以完成这项工作,但这很可能不是练习所要求的。
【问题讨论】:
-
为什么不用读写锁?
-
每个阅读器必须为每个A循环做一次阅读,我必须在M阅读器上做同样的工作,而不是让阅读器一起工作
标签: algorithm synchronization shared-memory semaphore writers