以下是我的代码:
#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;
}我设置了三个信号量,包括full、empty和mutex。empty初始化为20,full初始化为0,mutex初始化为1。
我把P(empty)放在生产者临界区的前面,把V(full)放在它后面,用P(mutex)m,V(mutex)锁住。我将P(full)放在消费者关键部分的前面,将V(empty)放在它后面,使用P(mutex),V(mutex)进行锁定。我使用shm来设置和获取共享内存。
它应该得到生产者生产和消费者消费的结果。但是我的程序从来没有运行过消费者生产者处理器。这让我很困惑。我是不是用错了信号量?或者我以错误的方式设置了共享内存?
发布于 2018-04-12 16:58:37
有几件事你应该解决。
信号量也必须在共享内存中,所以您必须在父进程中执行以下操作:
mutex_memid = shmget(IPC_PRIVATE, sizeof(sem_t), IPC_CREAT|0600);然后在父进程和子进程中shmat它们。
mutex = (sem_t *)shmat(mutex_memid, NULL, 0);您不需要在每次使用共享内存时都附加和分离它,所以您可以在while循环之前执行shmat,并在使用完共享内存后执行shmdt (在循环之外)。
您不需要存储shm_get_addr和shm_set_addr,因为在示例中这两个进程都没有使用这些变量。
https://stackoverflow.com/questions/49788414
复制相似问题