生产者消费者解决方案

时间:2016-04-18 16:48:03

标签: c malloc

我在C中开发了生产者/消费者问题,由于某种原因它没有编译。我收到错误消息:

 try1.c: In function ‘main’:

try1.c:19:21: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]

       BUFFER=(char *) malloc(sizeof(char) * BufferSize);

有人可以确定问题吗?已经尝试了一段时间来解决这个问题但是没有运气。

#include <stdio.h>
#include <pthread.h>
#define BufferSize 10

void *Producer();
void *Consumer();

int BufferIndex=0;
char *BUFFER;

pthread_cond_t Buffer_Not_Full=PTHREAD_COND_INITIALIZER;
pthread_cond_t Buffer_Not_Empty=PTHREAD_COND_INITIALIZER;
pthread_mutex_t mVar=PTHREAD_MUTEX_INITIALIZER;

int main()
{    
    pthread_t ptid,ctid;

    BUFFER=(char *) malloc(sizeof(char) * BufferSize);            

    pthread_create(&ptid,NULL,Producer,NULL);
    pthread_create(&ctid,NULL,Consumer,NULL);

    pthread_join(ptid,NULL);
    pthread_join(ctid,NULL);


    return 0;
}

void *Producer()
{    
    for(;;)
    {
        pthread_mutex_lock(&mVar);
        if(BufferIndex==BufferSize)
        {                        
            pthread_cond_wait(&Buffer_Not_Full,&mVar);
        }                        
        BUFFER[BufferIndex++]='@';
         printf("Produce : %d \n",BufferIndex);
        pthread_mutex_unlock(&mVar);
        pthread_cond_signal(&Buffer_Not_Empty);        
    }    

}

void *Consumer()
{
    for(;;)
    {
        pthread_mutex_lock(&mVar);
        if(BufferIndex==-1)
         {            
             pthread_cond_wait(&Buffer_Not_Empty,&mVar);
         }                
        printf("Consume : %d \n",BufferIndex--);        
        pthread_mutex_unlock(&mVar);        
        pthread_cond_signal(&Buffer_Not_Full);                
    }    
}

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:1)

首先,这个问题与生产者/消费者无关。它与你未声明的函数的使用有关。

历史上,C允许调用一个从未声明过的函数。由于技术上不需要函数声明来调用它,编译器很乐意添加指令来调用未知函数。据称,它允许开发人员节省宝贵的击键。但是,您需要一个函数声明来知道它的返回值,并且编译器假定这样一个函数的返回值是int。你就是这样 - 一个隐含声明的malloc()假设返回类型为int

现在,编译器知道 malloc()是什么。它通常是内置的内在功能。但是,编译器也知道所述malloc()的返回值是void*,而不是int - 因此它会抱怨。

解决方案 - 摆脱隐式声明,养成为每个正在使用的函数包含适当头文件的习惯。

您对使用条件变量的方式也存在问题,但我会将其留给另一个问题。

答案 1 :(得分:1)

当缓冲区已满时,生产者应该进入睡眠状态。下次消费者删除数据时,它会通知生产者和生产者再次开始生成数据。当缓冲区为空时,消费者应该进入睡眠状态。下一次当生产者添加数据时,它通知消费者并且消费者开始消费数据。使用信号量可以实现此解决方案。

#include<stdio.h>
#include<stdlib.h>
#include <pthread.h>
#include <semaphore.h>
int mutex=1,full=0,empty=3,x=0;

int main()
{
    int n;
    void producer(void);
    void consumer(void);
    int waiting(int);
    int signaling(int);
    printf("\n1.Producer\n2.Consumer\n3.Exit");
    while(1)
    {
        printf("\nEnter your choice:");
        scanf("%d",&n);
        switch(n)
        {
            case 1: if((mutex==1)&&(empty!=0))
                producer();
            else
                printf("Buffer is full!!");
                break;
            case 2:    if((mutex==1)&&(full!=0))
                consumer();
            else
                printf("Buffer is empty!!");
                break;
            case 3:
                exit(0);
                break;
        }
    }

    return 0;
}

int waiting(int s)
{
    return (--s);
}

int signaling(int s)
{
    return(++s);
}

void producer()
{
    mutex=wait(&mutex);
    full=signaling(full);
    empty=wait(&empty);
    x++;
    printf("\nProducer produces the item %d",x);
    mutex=signaling(mutex);
}

void consumer()
{
    mutex=wait(&mutex);
    full=wait(&full);
    empty=signaling(empty);
    printf("\nConsumer consumes item %d",x);
    x--;
    mutex=signaling(mutex);
}

答案 2 :(得分:0)

只需包含stdlib.h库。该库将包含malloc()函数。

答案 3 :(得分:0)

您正在使用malloc而不包含声明它的头文件(stdlib.h)。

您的用法(没有来自stdlib.h的明确声明)会创建一个&#34;隐式声明&#34;它与编译器所知道的不匹配,因为你的返回char*而正确的malloc会返回void*

所以添加include <stdlib.h>并注意你不应该转换malloc的结果。见Do I cast the result of malloc?