处理同步

时间:2015-01-23 01:09:44

标签: c process synchronization semaphore

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进程何时读取数据?

2 个答案:

答案 0 :(得分:1)

使用计数信号量,如下所示:

处理循环(1个实例):

  1. 写数据。
  2. 减少信号量N次。
  3. 进程B循环(N个实例):

    1. 阅读数据。
    2. 一次增加信号量。
    3. 每个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进程都知道其信号量数组的索引,这就是为什么我不确定它是否正确。