gpt4 book ai didi

c - 使用信号量避免竞争条件

转载 作者:行者123 更新时间:2023-11-30 17:54:22 24 4
gpt4 key购买 nike

我必须使用进程创建一个竞争条件程序,我也是如此。现在,我正在尝试使用信号量来解决它。我有两个关键部分,我试图使用我在 initStem() 中使用 semctl() 创建的信号量来保护它们。P()V() 递增和递减其第二个参数中指定的信号量的互斥量。

不幸的是,我的竞争条件似乎仍然存在:我的输出是:

value in parent: 4
value after child exec: 4

什么时候应该是:

value in parent: 4
value after child exec: 5

(5 + 1 - 1 = 5...)

这是我的代码:

#define KEY 4567
#define PERMS 0660
#define ID_PROJ "race"
#define NB_SEMAPHORES 1

int initSem(char **argv);
int P(int semid, int semnum);
int V(int semid, int semnum);

int main(int argc, char **argv) {

int id, pid1;
int *shared;
int tmp;

if ((id = shmget(KEY, 2*sizeof(int), IPC_CREAT | PERMS)) == -1) {
perror("shmget");
exit(-1);
}

shared=(int *)shmat(id, NULL, 0);
shared[0]=5; // value
shared[1]=initSem(argv); // semaphore id

if ((pid1=fork()) == 0) {
P(shared[1], 0); // Start critical section
tmp=shared[0];
tmp++;
sleep(2);
shared[0]=tmp;
V(shared[1], 0); // End critical section
exit(0);
}
else {
P(shared[1], 0); // Start
tmp=shared[0];
tmp--;
sleep(4);
shared[0]=tmp;
V(shared[1], 0); // End

printf("value in parent: %d\n", shared[0]);

waitpid(pid1, NULL, 0);
printf("value after child exec: %d\n", shared[0]);
shmctl(id, IPC_RMID, NULL);
}
}

所以我想知道:我是否正确使用了信号量?我在两个进程中使用相同的信号量是否正确?

编辑:

以下是我用来与信号量交互的 3 个函数:

int initSem(char **argv) {
int i,semid;
key_t key=ftok(argv[0], 'P');
semid=semget(key, NB_SEMAPHORES, IPC_CREAT | PERMS);
for(i=0 ; i<NB_SEMAPHORES ; i++)
semctl(key, i, SETVAL, 1);
return semid;
}

int P(int semid, int semnum) {
struct sembuf op;
op.sem_num=semnum;
op.sem_op=-1;
op.sem_flg=0;
semop(semid, &op, 1);
}

int V(int semid, int semnum) {
struct sembuf op;
op.sem_num=semnum;
op.sem_op=1;
op.sem_flg=0;
semop(semid, &op, 1);
}

最佳答案

确保使用 sem_init() 创建信号量将 pshared 设置为非零

关于c - 使用信号量避免竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14986608/

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