多线程实现奇偶统计v1

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 #include "pthread.h"
  5 #define BUFFER_SIZE 1600
  6 #define OVER (110000)
  7 /* 设置一个整数的圆形缓冲区 */
  8 struct prodcons {
  9     int buffer[BUFFER_SIZE]; /* 缓冲区数组 */
 10     pthread_mutex_t lock; /* 互斥锁 */
 11     int readpos, writepos; /* 读写的位置*/
 12     int ji, ou, zheng, fu, zero;    //奇数、偶数、正数、负数,零的个数
 13     pthread_cond_t readable; /* 缓冲区非空信号 */
 14     pthread_cond_t writeable; /*缓冲区非满信号 */
 15 };
 16 /*--------------------------------------------------------*/
 17 /*初始化缓冲区*/
 18 void init(struct prodcons * b)
 19 {
 20     pthread_mutex_init(&b->lock, NULL);
 21     pthread_cond_init(&b->readable, NULL);
 22     pthread_cond_init(&b->writeable, NULL);
 23     b->readpos = 0;
 24     b->writepos = 0;
 25     b->ji=0;
 26     b->ou=0;
 27     b->zheng=0;
 28     b->fu=0;
 29     b->zero=0;
 30 }
 31 /*--------------------------------------------------------*/
 32 /* 向缓冲区中写入一个整数*/
 33 void put(struct prodcons * b, int data)
 34 {
 35     pthread_mutex_lock(&b->lock);
 36     /*等待缓冲区非满*/
 37     //写的话,我就不等了
 38 //    while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) {
 39 //    while (b->writepos  == b->readpos) {
 40 //        printf("wait for not write able
");
 41 //        pthread_cond_wait(&b->writeable, &b->lock);
 42 //    }
 43     /*写数据并且指针前移*/
 44     b->buffer[b->writepos] = data;
 45     b->writepos++;
 46 //    if (b->writepos >= BUFFER_SIZE) b->writepos = 0;
 47     /*设置缓冲区非空信号*/
 48     if (b->writepos  > b->readpos) 
 49         pthread_cond_signal(&b->readable);
 50     pthread_mutex_unlock(&b->lock);
 51 }
 52 /*--------------------------------------------------------*/
 53 /*从缓冲区中读出一个整数 */
 54 int get(struct prodcons * b)
 55 {
 56     int data;
 57     pthread_mutex_lock(&b->lock);
 58     /* 等待缓冲区非空*/
 59     while (b->writepos <= b->readpos) {
 60         printf("wait for new data
");
 61         pthread_cond_wait(&b->readable, &b->lock);
 62     }
 63     /* 读数据并且指针前移 */
 64     data = b->buffer[b->readpos];
 65     b->readpos++;
 66     //统计
 67     if(data!=OVER){
 68         if(data%2==0)    b->ou++;
 69         else    b->ji++;
 70         if(data==0)    b->zero++;
 71         else if(data>0)    b->zheng++;
 72         else    b->fu++;
 73     }
 74 //    if (b->readpos >= BUFFER_SIZE) b->readpos = 0;
 75     /* 设置缓冲区非满信号*/
 76 //    pthread_cond_signal(&b->writeable);
 77     pthread_mutex_unlock(&b->lock);
 78     return data;
 79 }
 80 /*--------------------------------------------------------*/
 81 struct prodcons buffer;
 82 /*--------------------------------------------------------*/
 83 void * producer(void * data)
 84 {
 85     int n;
 86     int m;
 87     srand(time(0));
 88     for (n = 0; n < 1000; n++) {
 89 //        srand(time(0));
 90     //    m=(rand()*1000)%1000;
 91         m=(rand())%1000-500;
 92         printf(" wirte-->%d
", m);
 93         put(&buffer, m);
 94     }
 95     put(&buffer, OVER);
 96     printf("producer stopped!
");
 97     return NULL;
 98 }
 99 /*--------------------------------------------------------*/
100 void * consumer(void * data)
101 {
102     int d;
103     while (1) {
104         d = get(&buffer);
105         if (d == OVER ) break;
106         printf(" %d-->read
", d);
107     }
108     printf("consumer stopped!
");
109     return NULL;
110 }
111 /*--------------------------------------------------------*/
112 int main(void)
113 {
114     pthread_t th_a, th_b;
115     void * retval;
116     init(&buffer);
117     pthread_create(&th_a, NULL, producer, 0);
118     pthread_create(&th_b, NULL, consumer, 0);
119     /* 等待生产者和消费者结束 */
120     pthread_join(th_a, &retval);
121     pthread_join(th_b, &retval);
122     printf("奇数个数:%d
",buffer.ji);
123     printf("偶数个数:%d
",buffer.ou);
124     printf("正数个数:%d
",buffer.zheng);
125     printf("负数个数:%d
",buffer.fu);
126     printf("零的个数:%d
",buffer.zero);
127     return 0;
128 }
原文地址:https://www.cnblogs.com/fallenmoon/p/6744593.html