write_semaphore -> 1
1-Process A
main(){
int a[50],i;
for (i = 0; i < 50; i++)
{
//wait(write_semaphore)
x = a[i];
}
}
N-Processes B
main(){
int b[50],i;
for (i = 0; i < 50; i++)
{
b[i] = x;
}
}
我有1个A流程和N个B流程。进程将数组的元素写入共享变量x。然后,所有N B进程必须读取数据并将其存储到本地阵列。当所有N B进程都存储它时,A进程最终可以将数组的下一个元素分配给变量x。
示例:
// A process
i = 0
x = a[0];
// B processes
b[0] = x; // To ALL
// A process (I can continue now)
i = 1;
...
如何使用信号量同步它?读取数据的最后一个进程B用信号通知写信号量,以便A进程写入下一个元素。我怎么知道每个B进程何时读取数据?
答案 0 :(得分:1)
使用计数信号量,如下所示:
处理循环(1个实例):
进程B循环(N个实例):
每个B的实例必须递减一次信号量,如果每个B递增一次,这将阻止A直到B的N次完成。
让B等待再读一遍,直到A写完为止。 :)你可以用N个信号量来做(因为在A的单次迭代中不能允许相同的B读两次);我不确定是否有更精简的方式。
答案 1 :(得分:1)
这是一个使用信号量数组的解决方案。我不确定它是否100%正确。
sem write_semaphore -> 1
sem counter_mutext -> 1
sem read[M] -> 0 // every element 0. (pseudocode)
int counter = 0;
1-Process A
main(){
int a[50],i;
for (i = 0; i < 50; i++)
{
wait(write_semaphore)
x = a[i];
for (j = 0; j < M; j++)
up(read[j]); //everyone can now read
}
}
N-Processes B
main(){
int b[50],i;
int index; // the index of my semaphore in the array
for (i = 0; i < 50; i++)
{
down(read[index]); // i block until A signals me
b[i] = x;
down(counter_mutex);
counter++;
if (counter == M) // everyone read
up(write_semaphore);
counter = 0;
up(counter_mutex);
}
}
此解决方案要求每个B进程都知道其信号量数组的索引,这就是为什么我不确定它是否正确。