我正在尝试从主流程中创建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
#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);
}