父子进程之间无法修改共享变量count

问题描述

在以下代码中,父进程和子进程在修改count之后,count始终为0。

#include "stdio.h"
#include "unistd.h"
#define MAXSIZE 100
int in = 0;
int out = 0;
int count=0;
int child_process_id = 0;
char buffer[MAXSIZE];
void producer();
void comsumer();
void main() {

    __pid_t pid = fork();
    printf("The process id = %d\n", pid);
    if(pid == -1) {
        perror("fork error!");
    } else if(pid == 0){
        printf("Hello from child process: %d\n", getpid());
        child_process_id = getpid();
        comsumer();

    } else {
        printf("Hello from father process: %d\n", getpid());
        //__pid_t pid1 = fork();

        producer();

    }

}

void producer() {
    while (1)
    {
        while (count == MAXSIZE){
            printf("producer:%d, %d\n", count, getpid());

            scanf("%d", count);

        }
        in = (in+1)%MAXSIZE;
        count++;
    }
    
}

void comsumer() {

    while (1)
    {

        while (count == 0){
        printf("comsumer:%d, %d\n", count, getpid());
        scanf("%d", count);
         
        }

        out = (out+1)%MAXSIZE;
        count--;   
        
        }
        printf("Comsumer exit!\n");
    
}

问题分析

count会被子进程赋值过去,所以fork之后,父进程和子进程都有自己的count.无法修改count,所以count始终为0.

解决方法

count改为*count,这时fork之后,子进程复制的是地址。但是修改的时候修改*count的内容就好,count内存地址保持和父进程一样就可以。

问题:运行的时候发现count打印结果还是0.

原因:由于count=10,在comsumer进程中很快就消耗到0,所以无法被producer进程感知到count发生变化,其实comsumer已经从10变为0.

解决方法:通过scanf中断的形式,认为地修改count为10,此时comsumer进程无法在100以内时间完成到0地任务,这时producer恰好感知到了count变化,于是就进入了producer的减1操作。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值