生产者不加延时,消费者加延时,才能正常消费,如果消费者不加延时,生产者加延时,就是超前消费,不适合社会发展,也就没有意义了,消费是空的
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
pthread_cond_t buffernotempty=PTHREAD_COND_INITIALIZER;//生产者条件变量的静态初始化
pthread_cond_t buffernotefull= PTHREAD_COND_INITIALIZER;//消费者条件变量的静态初始化
pthread_mutex_t mutex;
#define LOOPNUM 50 //定义循环次数
#define BUFMAX 5
int buffer[BUFMAX];//定义一个数组
int val =0;// 定义一个可递增的变量,要放到数组中
unsigned int counter = 0;//记录生产者生产的个数
void *producer(void *arg)
{ int i=0;
for(i=0;i< LOOPNUM;i )
{
if( 0 > pthread_mutex_lock(&mutex))//加锁
{
perror("producer : pthread_mutex_lock");
exit(-1);
}
if(counter == BUFMAX)//判断生产满了没有,如果满了,就等待
{
if( 0 != pthread_cond_wait ( &buffernotefull ,&mutex))
{
perror ("producer:pthread_cond_wait ");
exit(-1);
}
}
if( 0 > pthread_mutex_unlock(&mutex))//解锁
{
perror("producer: pthread_mutex_unlock");
exit(-1);
}
buffer[i % BUFMAX] =val ;//向数组中放数
if( 0 > pthread_mutex_lock(&mutex))//加锁
{
perror("producer: pthread_mutex_lock");
exit(-1);
}
counter ;//记录加的数的个数
fprintf(stdout,"[producer] total number:%dn",counter);//输出记录的个数
if(0!= pthread_cond_signal(&buffernotempty))//释放生产者的线程
{
perror("producer : pthread_cond_signal");
exit(-1);
}
if( 0 > pthread_mutex_unlock(&mutex))//解锁
{
perror("producer: pthread_mutex_unlock");
exit(-1);
}
//sleep(1);
}
pthread_exit((void *)0);//终止生产者这个线程
}
void *user(void *arg)//消费者
{ int i=0;
for(i=0;i<LOOPNUM;i )
{
pthread_mutex_lock(&mutex);//加锁
if( 0 == counter)//判断是否为空
{
pthread_cond_wait(&buffernotempty,&mutex);//如果为空则等待
}
pthread_mutex_unlock(&mutex);//解锁
fprintf(stdout,"[used]: %d n",buffer[i % BUFMAX]);//输出数组中的生产的个数
pthread_mutex_lock (&mutex);//加锁
counter--;//消费
fprintf(stdout,"[user]total number: %d n",counter);//消费情况
pthread_cond_signal(&buffernotefull);//释放消费空间
pthread_mutex_unlock ( &mutex);//解锁
sleep(3);
}
pthread_exit((void *)0);//终止消费者这个线程
}
int main(void)
{
pthread_t th1,th2;
pthread_attr_t threadAttr;
pthread_attr_init(&threadAttr);
//pthread_create(&th2,&threadAttr,user,(void *)0);//这种情况是先创建消费者
//sleep(1);
pthread_create(&th1,&threadAttr,producer,(void *)0);//另一种情况是先创建生产者
sleep(1);
pthread_create(&th2,&threadAttr,user,(void *)0);
pthread_join(th1,NULL);// 用来获得另一个线程的终止状态并且释放该线程所占的资源
pthread_join(th2,NULL);
}
|