由子进程增加Counter变量,未命名的posix信号灯不起作用

问题描述 投票:0回答:3

我正在尝试从主流程中创建4个子流程,然后该子流程将进入关键区域以对其进行锁定并增加变量计数器

当所有过程结束时都打印最终计数器

在下面的给定代码中,我无法增加计数器

PS:我已经阅读了一些有关未命名信号量的文章,并在堆栈溢出中看到了一些文章。或者它们不能解决我的问题,或者它们是线程和信号量的示例,而不是子进程和信号量的示例

此外,我坚持使用未命名的信号量因为我是新来的,所以我可能会犯一些愚蠢的错误。

#include<stdio.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<semaphore.h>
#include<unistd.h>
#include<stdlib.h>

sem_t mutex;
int counter = 1;


void child(int id){
    // critical region
    sem_wait(&mutex);

    printf("Counter right now for %d is %d\n" , id, counter);
    printf("Increasing counter for %d\n", id);
    (counter)++;
    printf("Counter now for %d is %d\n", id, counter);

    sem_post(&mutex);
}

int main(){
    pid_t pid;
    sem_init(&mutex, 1, 1);

    for(int kid = 1; kid < 5; kid++){
        pid = fork();
        if(pid==0){
            child(kid);
            printf("Counter after child %d is %d\n\n", kid, counter);
            exit(0);
        }
        else{
            printf("parent process %d with counter = %d\n\n", kid, counter);
        }
    }

    int status;
    for(int kid=1; kid<5; kid++){
        wait(&status);
    }

    printf("final counter is %d\n", counter);
    sem_destroy(&mutex);
}

我得到的输出是1我期望的输出是5

c unix process posix semaphore
3个回答
1
投票
您需要研究forkshared memory的工作方式。单独的进程获得单独的内存。从父级复制某些内容到子级进程时,它们不会共享相同的内存。

0
投票
创建子进程时,该子进程拥有所有变量的副本,这意味着它们在每个过程中使用的内存空间都是不同的。所以当你做孩子的时候所有的孩子都会进入这里,所有的孩子都会增加自己的变量。您可以尝试创建线程而不是创建新进程

-1
投票
我已经使用线程为您编写了此解决方案:

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> int counter = 0; sem_t mutex; void *increment(void *arg) { sem_wait(&mutex); int *val; val = (int *) arg; printf("Counter right now for %d is %d\n" , *val, counter); printf("Increasing counter for %d\n", *val); counter++; printf("Counter now for %d is %d\n", *val, counter); sem_post(&mutex); } int main() { int i; sem_init(&mutex, 0, 1); pthread_t h; for (i = 1 ; i < 6 ; i++ ) { pthread_create(&h, NULL , increment , &i); pthread_join(h, NULL); } printf ("Final value of counter: %d\n", counter); }

© www.soinside.com 2019 - 2024. All rights reserved.