为什么我的 C 语言生产者-消费者程序不能正常工作?

Why my producer-consumer program in C not working properly?

我正在尝试同步 02 个子进程,它们使用大小为 5 的缓冲区进行通信,仅使用信号量“空”和“满”。 进程 01 执行 producer() 函数,第二个进程执行 consumer(),但是消费者函数根本不执行,即使生产者是阻塞(空=0)。 5 次迭代后,我只得到 5 次插入但没有消耗(我现在插入 5 次)。另外我相信不需要互斥锁,因为只有 01 个生产者和 01 个消费者,对吧?这是02函数和主程序:

#include <semaphore.h>
#include <stdlib.h>
#include <stdio.h>
#include<unistd.h>
#include<sys/wait.h>
#include <pthread.h>

#define MaxItems 5 
#define BufferSize 5 

sem_t empty;
sem_t full;

//pthread_mutex_t lock;

int in = 0;
int out = 0;
int buffer[BufferSize];
int N = 20;

void *producer()
{   
    while(1)
    {
        //pthread_mutex_lock(&lock);
        sem_wait(&empty);
    
        buffer[in] = 5; // fill the buffer with numbers
        printf("\nInsert Item %d at %d\n", buffer[in],in);

        int emptyvalue, fullValue;
        sem_getvalue(&full, &fullValue); sem_getvalue(&empty, &emptyvalue);
        printf("full is:%d, empty is:%d\n", fullValue, emptyvalue);

        //pthread_mutex_unlock(&lock);  
        sem_post(&full); // increase the value of full, so the consumer should execute now?
        in = (in+1)%BufferSize;
        usleep(500000);
    } 
}

void *consumer()
{   
    printf("test: consumer"); //this consumer function does not execute
    
    while (1)
    {
        sem_wait(&full); // full initially is = 0, so it blocks at first
        //pthread_mutex_lock(&lock);
       
        int item = buffer[out];
        printf("Remove Item %d from %d\n",item, out);
        
        //pthread_mutex_unlock(&lock);
        sem_post(&empty);

        printf(" %d", out); //using the values in the buffer
        out = (out+1)%BufferSize;
    }
}

int main()
{   
    //pthread_mutex_init(&lock, NULL);
    sem_init(&empty,0,BufferSize);
    sem_init(&full,0,0);

    pid_t id1, id2;

    id1 = fork();
    if (id1 == 0) {
      
        id2 = fork();
        if (id2 == 0) //child 2
        {
            printf("im the consumer");
            consumer();
        }else{ //child 1
            printf("i'm the producer");
            producer();
        }
    }else{
        sem_destroy(&full);
        sem_destroy(&empty);
        //pthread_mutex_destroy(&lock);
        return 0;
    }
}

非常感谢

默认情况下,不同的进程位于不同的虚拟地址空间中。他们无法访问彼此的记忆。 POSIX 信号量也是如此。这意味着当您使用 fork 进行两个过程时,您最终会得到两组不同的变量。每个进程都有单独的 buffer 和信号量。

要使这项工作正常进行,您应该创建一个内存映射(mmap 对应 POSIX),在其中放置您需要在进程之间共享的所有数据,包括信号量。信号量应使用 pshared 初始化为非零。 sem_init 的手册页对此有更多详细信息。

或者,您可以使用其他形式的进程间通信,例如管道。