快速业务通道

linux下的生产者与消费者

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-05

生产者不加延时,消费者加延时,才能正常消费,如果消费者不加延时,生产者加延时,就是超前消费,不适合社会发展,也就没有意义了,消费是空的

#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))//释放生产者的线程

Empire CMS,phome.net

{
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);

}

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号