Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148794
  • 博文数量: 38
  • 博客积分: 136
  • 博客等级: 民兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-10 22:36
个人简介

改变是痛苦的,不改变更加痛苦,不努力,别人想拉你一把,都找不到你手在哪,改变只为有梦想的人~

文章分类

全部博文(38)

文章存档

2015年(3)

2012年(35)

分类: C/C++

2012-07-25 18:14:55

#include   

#include   

#include   

#include   

#include   

#include   

   

#define N 5   // 消费者或者生产者的数目  

#define M 10 // 缓冲数目  

//int M=10;  

int in = 0; // 生产者放置产品的位置  

int out = 0; // 消费者取产品的位置  

   

int buff[M] = { 0 }; // 缓冲初始化为0,开始时没有产品  

   

sem_t empty_sem; // 同步信号量,当满了时阻止生产者放产品  

sem_t full_sem; // 同步信号量,当没产品时阻止消费者消费  

pthread_mutex_t mutex; // 互斥信号量,一次只有一个线程访问缓冲  

   

int product_id = 0; //生产者id  

int prochase_id = 0; //消费者id  

//信号处理函数  

void Handlesignal(int signo){  

    printf("程序退出\n",signo);  

    exit(0);  

}  

/* 打印缓冲情况 */  

void print() {  

       inti;  

       printf("产品队列为");  

       for(i = 0; i < M; i++)  

              printf("%d", buff[i]);  

       printf("\n");  

}  

   

/* 生产者方法 */  

void *product() {  

       intid = ++product_id;  

       while(1) {//重复进行  

              //sleep的数量可以调节生产和消费的速度,便于观察  

              sleep(2);  

   

              sem_wait(&empty_sem);  

              pthread_mutex_lock(&mutex);  

   

              inin % M;  

              printf("生产者%d在产品队列中放入第%d个产品\t",id, in);  

   

              buff[in]= 1;  

              print();  

              ++in;  

   

              pthread_mutex_unlock(&mutex);  

              sem_post(&full_sem);  

       }  

}  

   

/* 消费者方法 */  

void *prochase() {  

       intid = ++prochase_id;  

       while(1) {//重复进行  

              //sleep的数量可以调节生产和消费的速度,便于观察  

              sleep(5);  

   

              sem_wait(&full_sem);  

              pthread_mutex_lock(&mutex);  

   

              outout % M;  

              printf("消费者%d从产品队列中取出第%d个产品\t",id, out);  

   

              buff[out]= 0;  

              print();  

              ++out;  

   

              pthread_mutex_unlock(&mutex);  

              sem_post(&empty_sem);  

       }  

}  

   

int main() {  

       printf("生产者和消费者数目都为5,产品缓冲为10,生产者每2秒生产一个产品,消费者每5秒消费一个产品,Ctrl+退出程序\n");  

       pthread_tid1[N];  

       pthread_tid2[N];  

       inti;  

       intret[N];  

       //结束程序  

    if(signal(SIGINT,Handlesignal)==SIG_ERR){//ctrl+C产生SIGINT信号  

    printf("信号安装出错\n");  

    }  

// 初始化同步信号量  

       intini1 = sem_init(&empty_sem, 0, M);//产品队列缓冲同步  

       intini2 = sem_init(&full_sem, 0, 0);//线程运行同步  

       if(ini1 && ini2 != 0) {  

              printf("信号量初始化失败!\n");  

              exit(1);  

       }  

//初始化互斥信号量  

       intini3 = pthread_mutex_init(&mutex, NULL);  

       if(ini3 != 0) {  

              printf("线程同步初始化失败!\n");  

              exit(1);  

       }  

// 创建N个生产者线程  

       for(i = 0; i < N; i++) {  

              ret[i]= pthread_create(&id1[i], NULL, product, (void *) (&i));  

              if(ret[i] != 0) {  

                     printf("生产者%d线程创建失败!\n", i);  

                     exit(1);  

              }  

       }  

//创建N个消费者线程  

       for(i = 0; i < N; i++) {  

              ret[i]= pthread_create(&id2[i], NULL, prochase, NULL);  

              if(ret[i] != 0) {  

                     printf("消费者%d线程创建失败!\n", i);  

                     exit(1);  

              }  

       }  

//等待线程销毁  

       for(i = 0; i < N; i++) {  

              pthread_join(id1[i], NULL);  

              pthread_join(id2[i],NULL);  

       }  

       exit(0);  

}  

 

 

 

 

 

阅读(2293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~