条件变量的介绍

条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。

条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到这种改变,因为必须锁定互斥量以后才能计算条件。

条件变量使用之前必须首先初始化,pthread_cond_t数据类型代表的条件变量可以用两种方式进行初始化,可以把常量PTHREAD_COND_INITIALIZER赋给静态分配的条件变量,但是如果条件变量是动态分配的,可以使用pthread_cond_destroy函数对条件变量进行去除初始化。

条件变量相关API

1. 创建及销毁条件变量

#include <pthread.h>
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t cond);
// 返回:若成功返回0,否则返回错误编号

除非需要创建一个非默认属性的条件变量,否则pthread_cont_init函数的attr参数可以设NULL

2. 等待

#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cond struct timespec *restrict timeout);
// 返回:若成功返回0,否则返回错误编号

pthread_cond_wait等待条件变为真。如果在给定的时间内条件不能满足,那么会生成一个代表一个出错码的返回变量。传递给pthread_cond_wait的互斥量对条件进行保护,调用者把锁住的互斥量传给函数。函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,这两个操作都是原子操作。这样就关闭了条件检查和线程进入休眠状态等待条件改变这两个操作之间的时间通道,这样线程就不会错过条件的任何变化。pthread_cond_wait返回时,互斥量再次被锁住。

pthread_cond_timedwait函数的工作方式与pthread_cond_wait函数类似,只是多了一个timeout。timeout指定了等待的时间,它是通过timespec结构指定。

3. 触发

#include <pthread.h>
int pthread_cond_signal(pthread_cond_t cond);
int pthread_cond_broadcast(pthread_cond_t cond);
// 返回:若成功返回0,否则返回错误编号

这两个函数可以用于通知线程条件已经满足。pthread_cond_signal函数将唤醒等待该条件的某个线程,而pthread_cond_broadcast函数将唤醒等待该条件的所有进程。

注意一定要在改变条件状态以后再给线程发信号。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>int g_data = 0;//pthread_mutex_init(&mutex,NULL);    //动态创建锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //静态定义  宏pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *func1(void *arg)
{printf("t1:%ld thread in creat\n",(unsigned long)pthread_self());printf("t1:param is:%d\n",*((int *)arg));static int cnt = 0;while(1){pthread_cond_wait(&cond,&mutex);    //等待printf("t1 run=================================\n");printf("t1: %d\n",g_data);sleep(1);if(cnt == 10){exit(1);}g_data = 0;}}void *func2(void *arg)
{printf("t2:%ld thread in creat\n",(unsigned long)pthread_self());printf("t2:param is:%d\n",*((int *)arg));while(1){printf("t2: %d\n",g_data);pthread_mutex_lock(&mutex);g_data++;pthread_mutex_unlock(&mutex);if(g_data == 3){pthread_cond_signal(&cond);    //触发}sleep(1);}
}int main()
{int ret;int param=100;pthread_t t1;pthread_t t2;//pthread_mutex_init(&mutex,NULL);    //动态定义//pthread_cond_init(&cond,NULL);ret = pthread_create(&t1,NULL, func1, (void *)&param);if(ret == 0){//      printf("creat t1 success\n");}ret = pthread_create(&t2,NULL, func2, (void *)&param);if(ret == 0){//      printf("creat t2 success\n");}//printf("main:%ld\n",(unsigned long)pthread_self());pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_mutex_destroy(&mutex); //销毁pthread_cond_destroy(&cond);    //销毁return 0;
}
./a.out 10 >>test.ret.txt &        //将测试结果写入text.ret.txt文档中,测试你结果可在文档中查看
ps -aux|grep a.out  //查找正在运行的pid
kill -9 pid     //杀死进程

写个脚本测试

#include <stdio.h>
int main(int argc,char **argv)
{int time = atoi(argv[1]); //传入执行次数int i = 0;for(i=0;i<time;i++){system("./demo8");//把可执行程序命名为dome8}
}

线程的条件变量(cond)相关推荐

  1. Linux之线程条件变量cond

    概念:条件变量不是锁,要和互斥量组合使用.条件变量就是生产者"生产"完成,消费者才能"使用",如果没有"产品",消费者就会被条件变量cond ...

  2. Linux多线程开发-线程同步-条件变量pthread_cond_t

    1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...

  3. Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

    如题,使用条件变量Cond和channel通道实现多个生产者和消费者模型.Go语言天生带有C语言的基因,很多东西和C与很像,但是用起来 绝对比C语言方便.今天用Go语言来实现下多消费者和生产者模型.如 ...

  4. linux条件变量cond,Linux C 条件变量cond的使用记录

    条件变量是实现线程间同步的一种方法,条件变量用来自动阻塞一个线程,直到收到收到一个cond信号或其它特殊情况发送,条件变量使用的时候必须与互斥量同时使用,这是为了保证条件量在线程间操作的"原 ...

  5. Go语言中的条件变量Cond

    一.条件变量Cond的定义 Go语言里的条件变量,是一个结构体,它包括对应的方法和属性字段. Cond实现了⼀个条件变量,⼀个线程集合地,供线程等待或者宣布某事件的发⽣. 每个Cond实例都有⼀个相关 ...

  6. C11头文件threads.h声明了创建和管理线程,信号,条件变量的函数

    作者Danny Kalev 是通过以色列系统分析师协会认证的系统分析师, 并且是专攻C++的软件工程师. Kalev 写了多本C++的书籍,同时给不同的软件开发者站点投搞C++文章. 他是C++标准委 ...

  7. Java线程-线程池-条件变量

    条件变量是Java5线程当中很重要的一个概念,顾名思义,条件变量就是条件当中的一种变量,这里的条件没有实际意义,仅仅是个标记而已. 条件变量都实现了java.util.concurrent.locks ...

  8. 线程同步--条件变量

    条件变量可以说是线程同步中运用最多的方式.最常见的是运用在消费者-生产者模型中. 一般由一个线程充当生产者,一个线程充当生产者.消费者需要等到足够量的数据才来消耗数据.在这中间生产者产生数据,并在数据 ...

  9. linux条件变量cond,Linux 条件变量 pthread_cond_signal及pthread_cond_wait

    #include #include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*静态初始化*/ pthr ...

最新文章

  1. 给2019前端的5个建议
  2. 光脚丫学LINQ(025):如何验证DBML和外部映射文件
  3. OpenCV准密集立体声Quasi dense Stereo
  4. C++宏定义中#与##的妙用
  5. 简述C# XML解析方法的特点及应用
  6. python深度复制列表_Python-如何深层复制列表?
  7. STL10-deque容器
  8. Seata多微服务互相调用_全局分布式事物使用案例_Account-Module 账户微服务说明---微服务升级_SpringCloud Alibaba工作笔记0064
  9. 形态学操作之提取水平与垂直直线
  10. 【BFS】迷宫问题c++代码详解(逐句分析)
  11. 苹果又被拒了:Guideline 4.3 - Design
  12. delphi代码在linux编译运行,[教程] Delphi 10.2 Linux 程序开发环境部署的基本步骤
  13. 笔记--希尔伯特空间
  14. 通达信资金净流入公式_通达信指标公式:资金净流入,监控资金流入流出,分享...
  15. JAVA班车项目_JavaBooks/班车服务.md at master · Aim-Tric/JavaBooks · GitHub
  16. 【系统测试报告】苏科大App系统测试报告
  17. 微信ANDROID版本解析包错误,终于弄明白为什么手机安装软件会出现“解析包出现问题”...
  18. 谷歌浏览器(chrome)允许跨域设置的方法
  19. 50 条有趣的 Python 一行代码
  20. 关于SIGSEGV错误及处理方法

热门文章

  1. DVM,ART,JVM之间的关系
  2. 计算机基本组成及功能
  3. Gym-101173K Key Knocking 思维+贪心
  4. 油菜花王国(并查集)
  5. On persistence in mutual fund performance 1997翻译
  6. 计算机毕业设计ssm游泳馆管理平台
  7. 基因序列 深度学习Deep Learning for Genomics: A Concise Overview
  8. OCR 文字特征提取
  9. 静态html使用js发送邮件,科技常识:html实现邮箱发送邮件_js发送邮件至指定邮箱功能...
  10. 大量数据导出Excel方案