Увеличение переменной счетчика дочерним процессом и безымянным семафором posix не работает - PullRequest
0 голосов
/ 08 мая 2020
• 1000 1003 *

в приведенном ниже коде я не могу увеличить счетчик

PS: Я прочитал несколько сообщений о безымянных семафорах и видел несколько сообщений о переполнении стека. либо они не решают мою проблему, либо они являются примерами потоков и семафоров, а не дочерних процессов и семафоров

Также я настаиваю на использовании безымянного семафора, так как я новичок в этом, я могу делать глупостей sh ошибка.

#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

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Вам необходимо изучить, как работает fork и разделяемая память . Отдельные процессы получают отдельную память. Хотя копии некоторых вещей из родительского процесса делаются в дочернем процессе, они не используют одну и ту же память.

0 голосов
/ 08 мая 2020

Я написал для вас это решение, используя потоки:

#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);
}
0 голосов
/ 08 мая 2020

Когда вы создаете дочерний процесс, у этого дочернего процесса есть копия всех переменных, это означает, что пространство памяти, которое они используют, различно для каждого процесса. Итак, когда вы делаете ребенка (ребенка); сюда войдут все дети, и все они увеличат его собственную переменную. Вы можете попробовать создавать потоки вместо создания новых процессов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...