#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "pthread.h"
#define BUFFER_SIZE 1600
#define OVER (110000)
/* 设置一个整数的圆形缓冲区 */
struct prodcons {
int buffer[BUFFER_SIZE]; /* 缓冲区数组 */
pthread_mutex_t lock; /* 互斥锁 */
int readpos, writepos; /* 读写的位置*/
int ji, ou, zheng, fu, zero; //奇数、偶数、正数、负数,零的个数
pthread_cond_t readable; /* 缓冲区非空信号 */
pthread_cond_t writeable; /*缓冲区非满信号 */
};
/*--------------------------------------------------------*/
/*初始化缓冲区*/
void init(struct prodcons * b)
{
pthread_mutex_init(&b->lock, NULL);
pthread_cond_init(&b->readable, NULL);
pthread_cond_init(&b->writeable, NULL);
b->readpos = ;
b->writepos = ;
b->ji=;
b->ou=;
b->zheng=;
b->fu=;
b->zero=;
}
/*--------------------------------------------------------*/
/* 向缓冲区中写入一个整数*/
void put(struct prodcons * b, int data)
{
pthread_mutex_lock(&b->lock);
/*等待缓冲区非满*/
//写的话,我就不等了
// while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
// while (b->writepos == b->readpos) {
// printf("wait for not write able\n");
// pthread_cond_wait(&b->writeable, &b->lock);
// }
/*写数据并且指针前移*/
b->buffer[b->writepos] = data;
b->writepos++;
// if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
/*设置缓冲区非空信号*/
if (b->writepos > b->readpos)
pthread_cond_signal(&b->readable);
pthread_mutex_unlock(&b->lock);
}
/*--------------------------------------------------------*/
/*从缓冲区中读出一个整数 */
int get(struct prodcons * b)
{
int data;
pthread_mutex_lock(&b->lock);
/* 等待缓冲区非空*/
while (b->writepos <= b->readpos) {
printf("wait for new data\n");
pthread_cond_wait(&b->readable, &b->lock);
}
/* 读数据并且指针前移 */
data = b->buffer[b->readpos];
b->readpos++;
//统计
if(data!=OVER){
if(data%==) b->ou++;
else b->ji++;
if(data==) b->zero++;
else if(data>) b->zheng++;
else b->fu++;
}
// if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
/* 设置缓冲区非满信号*/
// pthread_cond_signal(&b->writeable);
pthread_mutex_unlock(&b->lock);
return data;
}
/*--------------------------------------------------------*/
struct prodcons buffer;
/*--------------------------------------------------------*/
void * producer(void * data)
{
int n;
int m;
srand(time());
for (n = ; n < ; n++) {
// srand(time(0));
// m=(rand()*1000)%1000;
m=(rand())%-;
printf(" wirte-->%d\n", m);
put(&buffer, m);
}
put(&buffer, OVER);
printf("producer stopped!\n");
return NULL;
}
/*--------------------------------------------------------*/
void * consumer(void * data)
{
int d;
while () {
d = get(&buffer);
if (d == OVER ) break;
printf(" %d-->read\n", d);
}
printf("consumer stopped!\n");
return NULL;
}
/*--------------------------------------------------------*/
int main(void)
{
pthread_t th_a, th_b;
void * retval;
init(&buffer);
pthread_create(&th_a, NULL, producer, );
pthread_create(&th_b, NULL, consumer, );
/* 等待生产者和消费者结束 */
pthread_join(th_a, &retval);
pthread_join(th_b, &retval);
printf("奇数个数:%d\n",buffer.ji);
printf("偶数个数:%d\n",buffer.ou);
printf("正数个数:%d\n",buffer.zheng);
printf("负数个数:%d\n",buffer.fu);
printf("零的个数:%d\n",buffer.zero);
return ;
}

最新文章

  1. Java基础之在窗口中绘图——绘制圆弧和椭圆(Sketcher 3 drawing arcs and ellipses)
  2. wordpress 在linux上配置固定url方法
  3. javascript的isPrototypeOf函数的理解
  4. 自己写的一个tomcat发布脚本
  5. awk 字符串处理函数
  6. Android View绘制和显示原理简介
  7. vue-awesome-swiper 的使用
  8. openssl 检测链路完整
  9. The First Day Of Cnblogs
  10. 31.Stack
  11. Springboot监控之一:SpringBoot四大神器之Actuator
  12. Js--String、Date、Array对象
  13. CSS面试复习(二):CSS的使用
  14. Navicat 提示 Access violation at address ***(如004ECCF4) in module ‘navicat.exe’. Read of address ***(如00000048)
  15. 深入了解Activiti工作流流程定义
  16. Kafka介绍及安装部署
  17. hduoj------确定比赛名次
  18. uva-11111-栈
  19. 构建WebGL目标时的内存考量
  20. python-爬图小样

热门文章

  1. hdu 1130How Many Trees?(卡特兰数)
  2. C#虚方法和抽象方法的区别
  3. 15.stop引发的数据不一致
  4. pipeline语法之environment,dir(),deleteDir()方法,readJSON,writeJSON
  5. OS---磁盘存储器
  6. OC学习篇之---KVC和KVO操作
  7. Jetson Nano系列教程0:初识Jetson Nano
  8. Monkeyrunner学习
  9. python之绘制函数pyplot初探
  10. 未来-YLB-跳蚤市场:跳蚤市场(flea market)