C在具有活动等待的子进程之间共享内存时出错
我正在尝试做一个在子进程和父进程之间共享内存的程序。该程序也使用fork 这项工作的目标是: -父亲向孩子(共享内存)发送3次带活动等待的向量 -子级接收vec,打印它并更改同步变量C在具有活动等待的子进程之间共享内存时出错,c,shared-memory,C,Shared Memory,我正在尝试做一个在子进程和父进程之间共享内存的程序。该程序也使用fork 这项工作的目标是: -父亲向孩子(共享内存)发送3次带活动等待的向量 -子级接收vec,打印它并更改同步变量 Struct: typedef struct{ int change[NUM_TOTAL]; int synchronize; }Exchange; 在第一次迭代之后,程序在“while(vec->synchronize!=0);”之后冻结。。。我猜这个问题存在于孩子的成长
Struct:
typedef struct{
int change[NUM_TOTAL];
int synchronize;
}Exchange;
在第一次迭代之后,程序在“while(vec->synchronize!=0);”之后冻结。。。我猜这个问题存在于孩子的成长过程中,但我不知道为什么…有什么想法吗
谢谢你我现在还不知道,但是我可以告诉你,每当两个线程写入同一个变量(
vec->synchronize
),你就会遇到麻烦。对于这样的同步,请允许我推荐管道或。仅当只有一个线程写入时,或者当您使用其他机制(如信号量或互斥)来控制对共享内存的访问时,才使用共享内存。如果您不能使用信号量,请改用信号和信号处理程序。如果您不能使用信号,我可以看到其他两种解决方案:
,
您应该使用原子函数,如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++
}