gpt4 book ai didi

c中带有信号量的临界区

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:00 26 4
gpt4 key购买 nike

我试图让两个进程修改一个公共(public)变量,同时相互排斥。我期望这段代码的输出是

12个或者2个1

但我一直在1个1.

我试过在进入临界区之前让进程进入休眠状态,但它们总是以相同的速度执行所有步骤并一起进入临界区。我该如何解决?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/shm.h>

static struct sembuf buf;

void enter(int semid, int semnum){
buf.sem_num = semnum;
buf.sem_op = 1;
buf.sem_flg = 0;
if (semop(semid, &buf, 1) == -1){
perror("Opening semaphore");
exit(1);
}
}

void leave(int semid, int semnum){
buf.sem_num = semnum;
buf.sem_op = -1;
buf.sem_flg = 0;
if (semop(semid, &buf, 1) == -1){
perror("Closing semaphore");
exit(1);
}
}
int main(int argc, char* argv[]){

int semid;

int i=0;

semid = semget(45281, 1, IPC_CREAT|0600);
if (semid == -1){
perror("Creating array of sems");
exit(1);
}
if (semctl(semid, 0, SETVAL, (int)1) == -1){
perror("Setting value to 1");
exit(1);
}
fork();

enter(semid,0);
i++;
leave(semid, 0);

printf("%d\n",i);
}

最佳答案

fork 操作为子进程创建一个单独的地址空间,它是父进程的精确副本。因此,您的值为 0 的变量 i 将被复制到您正在生成的子进程中,并且有自己独立的存在,这就是为什么您看到 i 值为1 在两个版画中。

关于c中带有信号量的临界区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42548278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com