[英]Increasing Counter variable by child process and unnamed posix semaphore is not working
我正在尝试从主进程创建 4 个子进程,然后子进程将 go 进入关键区域锁定它并增加变量计数器
当所有进程结束时打印最终计数器
在下面给定的代码中,我无法增加计数器
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);
}
我得到的 output 是 1 我期待的 output 是 5
当您创建一个子进程时,该子进程拥有所有变量的副本,这意味着它们使用的 memory 空间对于每个进程都是不同的。 所以当你在做孩子(孩子)的时候; 所有的孩子都会进入这里,他们都会增加他自己的变量。 您可以尝试创建线程而不是创建新进程
我已经使用线程为您编写了这个解决方案:
#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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.