gpt4 book ai didi

C - 共享内存和信号量

转载 作者:行者123 更新时间:2023-11-30 15:08:09 28 4
gpt4 key购买 nike

我想创建一个具有共享内存和信号量的 C 程序。应该有两个子进程工作。两个 child 都有不同的 int 号。然后有一个目标号码应该写入共享内存中。现在两个 child 都应该从目标数中减去他们的数字,直到目标数小于或等于 0。我不希望出现竞争条件。这就是我尝试使用信号量的原因。但这对我不起作用。这是我的代码:

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

#define SEG_SIZE sizeof(int)
#define NUM_OF_CHILDS 2

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

int i, shm_id, sem_id, *shar_mem;
int pid[NUM_OF_CHILDS];
long waittime = 100;
unsigned short marker[1];

/* Define the numbers and the goal number */

int numbers[2] = {28, 23};
int goal = (numbers[0] + numbers[1]) * 4;

/* Create semaphor */

if((sem_id = semget(IPC_PRIVATE, 1, IPC_CREAT|0644)) == -1){

perror("semget()");
exit(EXIT_FAILURE);

}

marker[0] = 1;

/* All sem's to 1 */

semctl(sem_id, 1, SETALL, marker);

/* Create shared memory */

if((shm_id = shmget(IPC_PRIVATE, SEG_SIZE, IPC_CREAT|0600)) == -1){

perror("shmget()");
exit(EXIT_FAILURE);

}
if((shar_mem = (int *)shmat(shm_id, 0, 0)) == (int *) -1){

perror("shmat()");
exit(EXIT_FAILURE);

}
*shar_mem = goal;

/* Create child processes */

for(i = 0; i < NUM_OF_CHILDS; i++){

pid[i] = fork();
if(pid[i] < 0){

printf("Error!\n");
exit(1);

}
if(pid[i] == 0){
int count = 0;
/* Child processes */

/* Structs for semaphor */

struct sembuf enter, leave;

enter.sem_num = leave.sem_num = 0;
enter.sem_flg = leave.sem_flg = SEM_UNDO;
enter.sem_op = -1; /* DOWN-Operation */
leave.sem_op = 1; /* UP-Operation */

/* Join critical area */

semop(sem_id, &enter, 1);

while(*shar_mem > 0){

usleep(waittime);
*shar_mem -= numbers[i];

count++;
}

printf("%i\n", count);

/* Leave critical area */

semop(sem_id, &leave, 1);

exit(0);

}

}

/* Wait for childs. */

for(i = 0; i < NUM_OF_CHILDS; i++){

waitpid(pid[i], NULL, 0);

}

/* Is goal equal 0 or lower? */

int returnv;

if(*shar_mem == 0){

/* No race conditions */

returnv = 0;

}
else {

/* Race conditions */

returnv = 1;

}

/* Close shared memory and semaphores */

shmdt(shar_mem);
shmctl(shm_id, IPC_RMID, 0);
semctl(sem_id, 0, IPC_RMID);

return returnv;

}

当共享内存值最后为0时,不应该出现竞争条件。如果它低于 0,则存在竞争条件。我的结果总是低于 0。除此之外,我还计算每个 child 减去他的数字的次数。结果:第一个 child 8 次,第二个 child 0 次。谁能帮我解决一下吗?

最佳答案

将 while 循环调整为类似这样的内容,以便在减去一次后离开临界区:

for ( ; ; ) {
usleep(waittime);
semop(sem_id, &enter, 1);
if (*shar_mem <= 0) {
semop(sem_id, &leave, 1);
break;
}
*shar_mem -= numbers[i];
semop(sem_id, &leave, 1);
count++;
}

但正如我的评论中所述,不能保证两个 child 交替减去他们的数字,即结果可能小于零

关于C - 共享内存和信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37589971/

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