#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 ;
}

多线程实现奇偶统计v1 - 暴力版的更多相关文章

  1. 多线程实现奇偶统计v2 - 信号量实现

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include "pthread.h& ...

  2. “易信”今日正式更新至V1.1版

    热门移动通讯社交应用“易信”今日正式更新至V1.1版,目前用户已可在苹果AppStore和各大Android商店下载.新版本主要包括三大变化:开通公众平台.提供外部分享.强化社交安全,此外包含好友关系 ...

  3. 【新提醒】N820 N821 android 4.2 V1.1版 - 大V综合交流区 - 360官方论坛

    http://bbs.360safe.com/forum.php?mod=viewthread&tid=3088815&extra=page%3D1%26filter%3Dtypeid ...

  4. 为了圣像画系统V1.0Beta版(javascript)-GIS520社区

    地图标绘系统V1.0測试版 (界面比較难看,之后再统一美化!)   演示地址:http://www.gis520.com/gis/plotdemo/index.html 查看可在菜单Map--> ...

  5. python--代码统计(进阶版)

    在上一篇的随笔中发表了代码统计小程序,但是发表后,我发现,以前写的代码怎么办 写了那么多,怎么就从0开始了呢,,,,我还是个孩子啊,不能这么残忍 于是,代码统计进阶版:统计当前目录下所有指定文件类型的 ...

  6. Hadoop fs -put bandwidth 暴力版

    /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreem ...

  7. 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)

    一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...

  8. HDU4288:Coder(线段树单点更新版 && 暴力版)

    Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...

  9. PAT 乙级 1042 字符统计(20) C++版

    1042. 字符统计(20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 请编写程序,找出一段给定文字中出现最 ...

随机推荐

  1. 在Emacs中使用plantuml画UML图

    在Emacs中使用plantuml画UML图 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #83 ...

  2. 关于html 修改滚动条的问题

    之前项目需要改变滚动条的样式 一.修改原生样式 原文地址:https://blog.csdn.net/zh_rey/article/details/72473284 问题在于无法兼容火狐与ie等浏览器 ...

  3. linux 服务器,登录出现login incorrect

    1.排查是否是登录用户的密码错误 2.查看本机电脑键盘是否有误 3.排查是否是服务器目录全是777权限 注意事项: 原因是您把系统中全部文件的权限改为的777 ,权限混乱,虽然现在可以访问,但是其他文 ...

  4. 【数据驱动】python之mysql的操作

    1.准备工作 在本篇中,我们使用python版本为python3.7.在python3中,连接mysql数据库我们需要使用pymysql这个第三方库.我们可以直接使用pip命令来安装,安装的命令为: ...

  5. poj Drainage Ditches(最大流入门)

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 85250   Accepted: 3316 ...

  6. Visual Studio Code如何编写运行C、C++

    Visual Studio Code如何编写运行C.C++ 作者:知乎用户链接:https://www.zhihu.com/question/30315894/answer/154979413来源:知 ...

  7. 【记录】linux常用命令二

    编辑文本时候删除文本数据 dd:删除游标所在的一整行(常用) ndd:n为数字.删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行 d1G:删除光标所在到第一行的所有数据 dG:删除光标 ...

  8. mysql分表详解

    经常听到有人说“数据表太大了,需要分表”,“xxxx了,要分表”的言论,那么,到底为什么要分表? 难道数据量大就要分表? mysql数据量对索引的影响 本人mysql版本为5.7 新增数据测试 为了测 ...

  9. nginx 反向代理服务

    目录 Nginx代理服务基本概述 Nginx代理服务常见模式 Nginx代理服务支持协议 Nginx反向代理配置语法 Nginx反向代理场景实践 配置代理实战 在lb01上安装nginx Nginx代 ...

  10. 【串线篇】依赖注入DI与控制反转IOC

    DI&IOC 在spring框架中DI与IOC说的其实是一回事 一句话:本来我接受各种参数来构造一个对象,现在只接受一个参数——已经实例化的对象. 也就是说我对对象的『依赖』是注入进来的,而和 ...