C 进程同步

C 进程同步,c,process,synchronization,semaphore,C,Process,Synchronization,Semaphore,1-过程A write_semaphore -> 1 sem write_semaphore -> 1 sem counter_mutext -> 1 sem read[M] -> 0 // every element 0. (pseudocode) int counter = 0; 如何使用信号量进行同步?读取数据的最后一个进程B应该向写信号量发送信号,以便A进程写入下一个元素。如何知道每个B进程何时读取数据?使用计数信号量,如下所示: 处理循环(1个实例): 写数

1-过程A

write_semaphore -> 1
sem write_semaphore -> 1
sem counter_mutext -> 1
sem read[M] -> 0 // every element 0. (pseudocode)
int counter = 0;

如何使用信号量进行同步?读取数据的最后一个进程B应该向写信号量发送信号,以便A进程写入下一个元素。如何知道每个B进程何时读取数据?

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

处理循环(1个实例):

  • 写数据
  • 减少信号量N次
  • 流程B循环(N个实例):

  • 读取数据
  • 增加信号量一次
  • 信号量必须在B的每个实例中递减一次,如果每个B递增一次,这将产生阻塞A直到N次B的完成的效果


    让B等到A写完后再读,这是一个练习。:)您可以使用N个信号量(因为同一个B不能在a的单个迭代中读取两次);我不确定是否有更精简的方法。

    这是一个使用信号量数组的解决方案。我不确定它是否100%正确

     // A process
     i = 0
     x = a[0];
    
     // B processes
    
     b[0] = x; // To ALL
    
     // A process (I can continue now)
     i = 1;
     ...
    
    1-过程A

    write_semaphore -> 1
    
    sem write_semaphore -> 1
    sem counter_mutext -> 1
    sem read[M] -> 0 // every element 0. (pseudocode)
    int counter = 0;
    
    main(){
    INTA[50],i;
    对于(i=0;i<50;i++)
    {
    等待(写入信号量)
    x=a[i];
    对于(j=0;j
    N-过程B

    main(){
        int a[50],i;
    
        for (i = 0; i < 50; i++)
        {
            //wait(write_semaphore)
            x = a[i];
        }
    }
    
    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 
        }
    }
    
    main(){
    int b[50],i;
    int index;//数组中我的信号量的索引
    对于(i=0;i<50;i++)
    {
    向下(读取[索引];//我阻塞,直到A向我发出信号
    b[i]=x;
    向下(计数器/互斥器);
    计数器++;
    if(counter==M)//每个人都读
    up(write_信号量);
    计数器=0;
    向上(计数器/互斥器);
    }
    }
    

    此解决方案要求每个B进程都知道其信号量数组的索引,这就是为什么我不确定它是否正确。

    上面的代码中没有共享变量
    x
    。在每个
    main()
    函数中都有一个局部变量
    x
    ,但它们之间100%完全不相关,只是名称不一致。您需要为要共享的进程创建一些共享内存,然后为要使用的进程创建信号量——一个用于发送“x中的值就绪”,另一个用于发送“x中读取的值”的信号;下一个,我的错。不应在电源内部定义变量x。即使将
    x
    设为全局变量,一个程序中的全局
    x
    与另一个程序中的全局
    x
    完全无关。您必须为要共享的变量创建共享内存。是的,假设它们存在。这更像是伪代码。。