C在具有活动等待的子进程之间共享内存时出错

C在具有活动等待的子进程之间共享内存时出错,c,shared-memory,C,Shared Memory,我正在尝试做一个在子进程和父进程之间共享内存的程序。该程序也使用fork 这项工作的目标是: -父亲向孩子(共享内存)发送3次带活动等待的向量 -子级接收vec,打印它并更改同步变量 Struct: typedef struct{ int change[NUM_TOTAL]; int synchronize; }Exchange; 在第一次迭代之后,程序在“while(vec->synchronize!=0);”之后冻结。。。我猜这个问题存在于孩子的成长

我正在尝试做一个在子进程和父进程之间共享内存的程序。该程序也使用fork

这项工作的目标是: -父亲向孩子(共享内存)发送3次带活动等待的向量

-子级接收vec,打印它并更改同步变量

  Struct:
    typedef struct{
    int change[NUM_TOTAL];
    int synchronize;
    }Exchange; 

在第一次迭代之后,程序在“while(vec->synchronize!=0);”之后冻结。。。我猜这个问题存在于孩子的成长过程中,但我不知道为什么…有什么想法吗


谢谢你

我现在还不知道,但是我可以告诉你,每当两个线程写入同一个变量(
vec->synchronize
),你就会遇到麻烦。对于这样的同步,请允许我推荐管道或。仅当只有一个线程写入时,或者当您使用其他机制(如信号量或互斥)来控制对共享内存的访问时,才使用共享内存。

如果您不能使用信号量,请改用信号和信号处理程序。如果您不能使用信号,我可以看到其他两种解决方案:

  • 当代码处于关键区域(修改共享内存)时,请使用掩码阻止所有信号。这样可以确保数据共享内存不会损坏

  • 不要在(vec->synchronize!=1)时执行
    您应该使用原子函数,如Test&Set。问题是它很难在软件中实现


  • 现在,这些已经不是很好的解决方案的最大缺点是,它们不能在多处理器系统中工作。

    我认为您的子进程部分应该还有1个while循环

    while(cont != 3){
         while(vec->synchronize!=1);   //Exit while when father change the variable to 1
         int i;
         for(i = 0; i < 10; i++){
              printf("%d\t",i);
         }
    
         ec->synchronize =0;    //Return to the father
         cont++
     }
    
    while(续!=3){
    while(vec->synchronize!=1);//将变量更改为1时退出
    int i;
    对于(i=0;i<10;i++){
    printf(“%d\t”,i);
    }
    ec->synchronize=0;//返回父对象
    续++
    }
    
    我知道如何使用信号量,但我不被允许OK,然后谷歌如何使用共享变量在较低级别实现信号量,并编写自己的实现:)。不是开玩笑-如果我只有shm可用,我会这么做。一旦你有了有效的信号量(甚至是互斥量),一切都变得容易多了。例如,请参见,以获取起点。该子对象仅将
    同步
    翻转到
    1
    一次,然后将其切换回
    0
    并退出。因此,父进程在其主循环的第二次迭代中陷入了无休止的繁忙等待中,等待(终止的)子进程再次切换共享变量。Nevado,您可以将此作为答案发布:)。欢迎来到这个网站!
         Father
         Child
          0 1   2   3   4   5   6   7   8   9
         cont 1
         Father
    
    while(cont != 3){
         while(vec->synchronize!=1);   //Exit while when father change the variable to 1
         int i;
         for(i = 0; i < 10; i++){
              printf("%d\t",i);
         }
    
         ec->synchronize =0;    //Return to the father
         cont++
     }