我在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);
}
}
非常感谢你的帮助。
答案 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?