直接上代码,主要用到sem_trywait & sem_post

  1. #include<stdio.h>
  2. #include<pthread.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. #include<semaphore.h>
  6. #include<time.h>
  7.  
  8. sem_t sem_cal;
  9. sem_t sem_times;
  10.  
  11. typedef struct _cal_
  12. {
  13. int sum;
  14. }CAL;
  15. CAL cal;
  16.  
  17. void *calculate(void*arg)
  18. {
  19. int i;
  20. int sum;
  21. for(i = 0; i < 3; i++)
  22. {
  23. cal.sum = cal.sum + i;
  24. sleep(1);
  25. }
  26. sem_post(&sem_cal);
  27. }
  28.  
  29. void *sum(void *arg)
  30. {
  31. sem_wait(&sem_cal);
  32. printf("the sum is %d\n",cal.sum);
  33. sem_post(&sem_times);
  34. }
  35.  
  36. void do_other()
  37. {
  38. printf("do others\n");
  39. }
  40.  
  41. void *times(void *arg)
  42. {
  43. //do others
  44. while(1)
  45. {
  46. if(!sem_trywait(&sem_times))
  47. {
  48. printf("the times is %d\n",cal.sum * cal.sum);
  49. break;
  50. }
  51. do_other();
  52. sleep(1);
  53. }
  54. }
  55.  
  56. int main(void)
  57. {
  58. int ret=-1;
  59. pthread_t th[3];
  60. sem_init(&sem_cal,0,0);
  61. sem_init(&sem_times,0,0);
  62. ret = pthread_create(&th[0],NULL,calculate,NULL);
  63. if (ret != 0)
  64. {
  65. printf("Pthread_create failed\n");
  66. return -1;
  67. }
  68.  
  69. ret = pthread_create(&th[1],NULL,sum,NULL);
  70. if (ret != 0)
  71. {
  72. printf("Pthread_create failed\n");
  73. return -1;
  74. }
  75.  
  76. ret = pthread_create(&th[2],NULL,times,NULL);
  77. if (ret != 0)
  78. {
  79. printf("Pthread_create failed\n");
  80. return -1;
  81. }
  82.  
  83. pthread_join(th[0],NULL);
  84. pthread_join(th[1],NULL);
  85. pthread_join(th[2],NULL);
  86. return 0;
  87. }

pthread1

|----------------|post1|

pthread2

|----------------|wait1|---------------|post|

pthread2

|----------------|wait2|-----do_others---|

do_others 可以在pthread2 post 前执行业务。

利用多个sem信号量在线程通讯的更多相关文章

  1. Android 线程通讯类Handler

    handler是线程通讯工具类.用于传递消息.它有两个队列: 1.消息队列 2.线程队列 消息队列使用sendMessage和HandleMessage的组合来发送和处理消息. 线程队列类似一段代码, ...

  2. java多线程(2)---生命周期、线程通讯

    java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别.    1.yield()方法 yield()让当前正在运行的线程回到就绪 ...

  3. Android——线程通讯类Handler(转)

    原文地址:http://uule.iteye.com/blog/1705951 handler是线程通讯工具类.用于传递消息.它有两个队列:1.消息队列2.线程队列 消息队列使用sendMessage ...

  4. Linux多线程--使用信号量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过 ...

  5. 线程同步(使用了synchronized)和线程通讯(使用了wait,notify)

    线程同步 什么是线程同步? 当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题. 实现同步机制有两个方法:1.同 ...

  6. Java线程通讯方法之wait()、nofity() 详解

    Java线程通讯方法之wait().nofity() 详解 本文将探讨以下问题: synchronized 代码块使用 notify()与notifyAll()的区别 Java wait(),noti ...

  7. Android——线程通讯 Handler、Looper、Message;

    线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...

  8. java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  9. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

随机推荐

  1. Java中类变量(静态变量)和类方法(静态方法)

    类变量 类变量也叫静态变量或静态属性,是该类所有对象共享的变量任何一个该类的对象去访问它时,取得都是一样的值 语法: 访问修饰符  static  数据类型  变量名 static  访问修饰符  数 ...

  2. 手写一个springboot starter

    springboot的starter的作用就是自动装配.将配置类自动装配好放入ioc容器里.作为一个组件,提供给springboot的程序使用. 今天手写一个starter.功能很简单,调用start ...

  3. 理解OAuth2.0协议和授权机制

    无论是自然资源还是互联网上的资源,需要控制使用权与被使用权,以保护资源的安全.合理的使用和有效的管控. 项目中,我们需要控制的是用户资源,既要保证有效用户的合理使用,又要防范非法用户的攻击.如此,如何 ...

  4. python-利用json模块处理json数据几个函数总结

    1.前言 json是一种轻量级的数据交换格式,它是JavaScript的子集,易于人阅读和编写. 前端和后端进行数据交互,其实就是JS和Python进行数据交互. 接口间或者前后端间的语言不一致,不同 ...

  5. python-基础编程练习题

    题目1:九九乘法表 知识点:双层循环,print打印格式,默认换行打印 """ 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4 ...

  6. SpringBoot+MybatisPlus+Mysql+Sharding-JDBC分库分表实践

    一.序言 在实际业务中,单表数据增长较快,很容易达到数据瓶颈,比如单表百万级别数据量.当数据量继续增长时,数据的查询性能即使有索引的帮助下也不尽如意,这时可以引入数据分库分表技术. 本文将基于Spri ...

  7. bi工具是什么,如何选择?

    ​商业智能使用的一套方法和技术根据解决方案的目的而广泛多样化.有些工具专注于数据准备方面,可能包括ETL(提取,转换,加载)层,以更好地组织和利用数据.有些工具专注于更广泛的企业使用,可能专注于数据混 ...

  8. 零售BI:为什么说零售行业非上一套企业BI系统不可?

    如果你要问为什么现在越来越多的零售企业都会在公司上一套企业BI系统,这边文章就能解答你的疑惑. 2016年10月,马云在云栖大会上提出了"新零售"概念.在新零售时代,数字化转型打通 ...

  9. buu EZ三剑客-EzWeb

    查看源码 发现有提示 get 传secret , 尝试随便串值 http://......./?serect=1 发现这是linux命令, net-tools工具中的ifconfig ,但这个工具逐渐 ...

  10. @vue/cli的配置知道多少-publicPath,outputDir,assetsDir,indexPath,filenameHashing,configureWebpack,productionSourceMap

    vue.config.js的简单介绍 vue.config.js 是一个可选的配置文件, 在项目的 (和 package.json 同级的) 根目录中存在这个文件. 默认情况没有这个文件需要我们手动去 ...