gpt4 book ai didi

c - 生产者和消费者在 Linux c 中使用信号量

转载 作者:太空狗 更新时间:2023-10-29 12:39:46 25 4
gpt4 key购买 nike

以下是我的代码:

#include ...
sem_t mutex;
sem_t empty;
sem_t full;
int main()
{
int shmid_arr;
int shmid_get;
int shmid_set;
int *shmaddr = 0;
int *shm_get_addr;
int *shm_set_addr;
shmid_arr = shmget(IPC_PRIVATE, 20 * sizeof(int), IPC_CREAT|0600);
shmid_get = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT|0600);
shmid_set = shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT|0600);
**shmid_get = 0;
**shmid_set = 0;
sem_init(&mutex, 1 , 1 );
sem_init(&full, 1 , 0 );
sem_init(&empty, 1 , 20 );
printf("sem_init\n");
if(fork() == 0)
{
int i = 0;
while(i<20)
{
sem_wait(&empty);
sem_wait(&mutex);
shm_set_addr = (int *)shmat(shmid, NULL, 0);
shmaddr = (int *)shmat(shmid, NULL, 0);
shmaddr[*shm_set_addr%20] = i + 1;
printf("produce %d\n", i+1)
(* shm_set_addr)++;
i++;
shmdt(shmadrr);
shmdt(shm_set_addr);
sem_post(&mutex);
sem_post(&full);
}
sleep(10);
printf("Producer is over\n");
exit(0);
}else{
while(1)
{
sem_wait(&full);
sem_wait(&mutex);
shm_get_addr = (int *)shmat(shmid, NULL, 0);
shmaddr = (int *)shmat(shmid, NULL, 0);
printf("consumer get %d\n",shmaddr[*shm_get_addr%20]);
(*shm_get_addr)++;
shmdt(shmadrr);
shmdt(shm_get_addr);
sem_post(&mutex);
sem_post(&empty);
sleep(1);
}
printf("consumer over\n");
exit(0);
}
}
return 0;
}

我设置了三个信号量,包括fullemptymutexempty 初始化为 20full 初始化为 0mutex 初始化到 1

我将 P(empty) 放在生产者临界区前面,将 V(full) 放在它之后使用 P(mutex)m,V(mutex) 锁定。我使用 P(mutex),V(mutex)P(full) 放在消费者临界区前面,将 V(empty) 放在它之后锁定。我使用 shm 来设置和获取共享内存。

应该得到生产者生产,消费者消费的结果。但是我的程序从不运行消费者生产者处理器。这让我很困惑。我是否以错误的方式使用了信号量?还是我以错误的方式设置了共享内存?

最佳答案

有几件事你应该解决。

信号量也必须在共享内存中,所以你必须在父进程中做这样的事情:

mutex_memid = shmget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT|0600);

然后在父进程和子进程中shmat它们。

mutex = (sem_t *)shmat(mutex_memid, NULL, 0);

你不需要每次使用共享内存时都附加和分离它,所以你可以在while循环和shmdt之前shmat一旦你完成了共享内存的工作(在循环之外)。

您不需要存储 shm_get_addrshm_set_addr,因为您的示例中的两个进程都没有使用这些变量。

关于c - 生产者和消费者在 Linux c 中使用信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49788414/

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