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 = ;
  24. b->writepos = ;
  25. b->ji=;
  26. b->ou=;
  27. b->zheng=;
  28. b->fu=;
  29. b->zero=;
  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\n");
  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\n");
  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%==) b->ou++;
  69. else b->ji++;
  70. if(data==) b->zero++;
  71. else if(data>) 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());
  88. for (n = ; n < ; n++) {
  89. // srand(time(0));
  90. // m=(rand()*1000)%1000;
  91. m=(rand())%-;
  92. printf(" wirte-->%d\n", m);
  93. put(&buffer, m);
  94. }
  95. put(&buffer, OVER);
  96. printf("producer stopped!\n");
  97. return NULL;
  98. }
  99. /*--------------------------------------------------------*/
  100. void * consumer(void * data)
  101. {
  102. int d;
  103. while () {
  104. d = get(&buffer);
  105. if (d == OVER ) break;
  106. printf(" %d-->read\n", d);
  107. }
  108. printf("consumer stopped!\n");
  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, );
  118. pthread_create(&th_b, NULL, consumer, );
  119. /* 等待生产者和消费者结束 */
  120. pthread_join(th_a, &retval);
  121. pthread_join(th_b, &retval);
  122. printf("奇数个数:%d\n",buffer.ji);
  123. printf("偶数个数:%d\n",buffer.ou);
  124. printf("正数个数:%d\n",buffer.zheng);
  125. printf("负数个数:%d\n",buffer.fu);
  126. printf("零的个数:%d\n",buffer.zero);
  127. return ;
  128. }

多线程实现奇偶统计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. 公司redis

    一: redis cluster介绍篇 1:redis cluster的现状 目前redis支持的cluster特性(已亲测): 1):节点自动发现 2):slave->master 选举,集群 ...

  2. 43.Word Break(看字符串是否由词典中的单词组成)

    Level:   Medium 题目描述: Given a non-empty string s and a dictionary wordDict containing a list of non- ...

  3. BUUCTF 梅花香自苦寒来

    梅花香自苦寒来 打开图片可以看到,在jpg后面有大量的数据,将它保存出来,可以看出是十六进制,将它转为ascii,写脚本 with open('hex.txt','r') as h: h=h.read ...

  4. go中字符类型的使用小结

    示例 // 字符类型的用法 package main import ( "fmt" "unsafe" ) func main() { // 未指定类型并赋值字符 ...

  5. jsonp详细原理之一

    /*script标签是不存在跨域请求的,类似的还有img,background:url,link 你可以想象一下,平时的这些标签都是可以直接引入外部资源的,所以是不存在跨域问题的*/ function ...

  6. 【记录】iconfont 批量把图标加入购物车的方法

    iconfont  是阿里旗下很好用的图标管理网站(https://www.iconfont.cn/),里面有百万个小图标,可以随意下载切换颜色,是很多前端人员的选择. 但是网站没有将图标批量加入购物 ...

  7. [HTML知识体系]meta标签的常见用法

    1.meta是什么 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称 ...

  8. JavaScript仿淘宝实现放大镜效果的实例

    我们都知道放大镜效果一般都是用于一些商城中的,列如每当我们打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大镜的效果.在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是 ...

  9. elasticsearch 6.x 安装search guard

    前言 es之前版本一直无用户验证功能,不过官方有提供一x-pack,但是问题是付费.在es的6.3.2版本中,已经集成了x-pack,虽然es团队已经对x-pack开源,但是在该版本中如果需要使用到安 ...

  10. PHP curl_reset函数

    curl_reset— 重置libcurl会话句柄的所有选项. 说明 void curl_reset ( resource $ch ) 该函数将重新初始化cURL的所有选项值(默认值). 注意:cur ...