在运行多个进程时使用具有共享内存的信号量

时间:2015-04-11 19:47:59

标签: c concurrency semaphore shared-memory

我正在学习一些涉及信号量的简单的生产者/消费者例子,但很难向自己解释为什么我会得到某个结果(因为我是C的noobie)。

当我运行以下生产者的两个并发进程时,两个进程都挂起并且永远不会完成:

#include <stdio.h>
#include <sys/types.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>

#define BUFF_SIZE 20

typedef struct {
    char buffer[BUFF_SIZE];
    int nextIn;
    int nextOut;
} shared_data;

shared_data *shm, *s;

char sem_name1[] = "mutex";
char sem_name2[] = "empty_slots";
char sem_name3[] = "full_slots";

sem_t *empty_slots;
sem_t *full_slots;
sem_t *mutex;

void Put(char item)
{
    sem_wait(empty_slots);
    sem_wait(mutex);
    s->buffer[s->nextIn] = item;
    s->nextIn = (s->nextIn + 1) % BUFF_SIZE;
    sem_post(mutex);
    printf("Producing %c ... with pid = %d\n", item, getpid());
    sem_post(full_slots);
}

void Producer()
{
    int i;
    for(i = 0; i < 10; i++)
    {
        sleep(rand()%3);
        Put((char)('A'+ i % 26));
    }
}

void main()
{
    //Create and initialize the semaphores
    mutex=sem_open(sem_name1, O_CREAT,0644, 1);
    full_slots=sem_open(sem_name3, O_CREAT,0644, 0);
    empty_slots=sem_open(sem_name2, O_CREAT,0644, 10);

    //Create a key for the segment
    key_t key;
    key = 1234;

    //create the segment
    int shmid;
    if ((shmid = shmget(key, sizeof(shared_data), IPC_CREAT |0666)) <0)
    {
        perror("Shmget");
        exit(1);
    }

    //attach to the segment
    if ((shm = (shared_data *) shmat(shmid, NULL, 0))==(shared_data *) -1)
    {
        perror("Shmat");
        exit(1);
    }

    s=shm;
    s->nextIn = 0;

    Producer();

    //detach from the segment
    shmdt((void *) shm);
}

第一个和第二个进程的输出分别为:

First producer process Second producer process

有人可以帮助我理解为什么会发生这种情况(即为什么这些过程永远不会完成)?我创造了僵局吗?为什么或者为什么不?我完全被难倒了。

谢谢!

0 个答案:

没有答案