gpt4 book ai didi

c - 使用 SysV 信号量时不一致

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

我正在尝试使用 SysV 信号量和共享内存 API 应用我的信号量理论知识。

简而言之,我在 50 个进程之间共享 int 大小的内存(由信号量保护),每个进程递增 1000 次,所以最终我必须有一个最终值1000 * 50 = 50000 但奇怪的是我的值如下:49962、49965、49366...

这是我的 C 代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#define SHMSZ sizeof(int) /* Size of an integer*/

int main(){
key_t key = 241096; /* Hard-coded key */
int shm_id, sem_id, *shm;
struct sembuf psem = {0, -1, 0};
struct sembuf vsem = {0, 1, 0};

if((shm_id = shmget(key, SHMSZ, IPC_CREAT | 0666)) == -1){
printf("Err shmget");
exit(1);
}

if((shm = shmat(shm_id, NULL, 0)) == (int *) -1){
printf("Err shmat");
}

*shm = 0; /*Initilize the shared memory*/

if((sem_id = semget(key, 1, IPC_CREAT | 0666)) == -1){
printf("Err semget prg");
exit(1);
}

/***Semaphore initialization****/
semop(sem_id, &vsem, 1); /*set sem_value to 1*/
/**********************************/

int i;
for (i = 0; i < 50; i++){
pid_t pid = fork();
if (pid == 0){
int j;
for (j = 0; j < 1000; j++){
semop(sem_id, &psem, 1); /*wait for the semaphore*/
*shm = *shm + 1;
semop(sem_id, &vsem, 1); /* signal the semaphore*/
}
return 0; /*Whene done incrementing, return */
}
}
while((wait(NULL) != -1)); /*Wait for all children to terminate*/
printf("--%i--", *shm); /*Print the final value of the shared memory*/
return 0;
}

最佳答案

我尝试执行您的代码,它按预期打印了 50000。尝试使用 ftok 和 key 在两个不同的共享内存之间生成非冗余 key 。

key_t key = ftok(FileName, AnyChar); // The program must have the right to access the file.

如果您在多次执行可执行文件时得到这些值,那肯定是因为您没有使用 ipcrm -a。此命令将删除您的程序创建的所有新 ipc。

关于c - 使用 SysV 信号量时不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984534/

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