6.9 条件变量的使用及注意事项
目录
条件变量
使用步骤:
初始化:
生产资源线程:
开始产生资源
消费者线程:
条件变量
应用场景:生产者消费者问题,是线程同步的一种手段。
必要性:为了实现等待某个资源,让线程休眠。提高运行效率
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,
const struct timespec *restrict abstime);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
使用步骤:
初始化:
静态初始化
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //初始化条件变量
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; //初始化互斥量
或使用动态初始化
pthread_cond_init(&cond);
生产资源线程:
pthread_mutex_lock(&mutex);
开始产生资源
pthread_cond_sigal(&cond); //通知一个消费线程
或者
pthread_cond_broadcast(&cond); //广播通知多个消费线程
pthread_mutex_unlock(&mutex);
消费者线程:
pthread_mutex_lock(&mutex);
while (如果没有资源){ //防止惊群效应
pthread_cond_wait(&cond, &mutex);
}
有资源了,消费资源
pthread_mutex_unlock(&mutex);
注意:
1 pthread_cond_wait(&cond, &mutex),在没有资源等待是是先unlock 休眠,等资源到了,再lock
所以pthread_cond_wait he pthread_mutex_lock 必须配对使用。
2 如果pthread_cond_signal或者pthread_cond_broadcast 早于 pthread_cond_wait ,则有可能会丢失信号。
3 pthead_cond_broadcast 信号会被多个线程收到,这叫线程的惊群效应。所以需要加上判断条件while循环。
6.9 条件变量的使用及注意事项相关推荐
- C++11下条件变量之虚假唤醒
概述: 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 在线程开发的过程中 ...
- 信号量,互斥锁,条件变量的联系与区别
转自:http://blog.chinaunix.net/u3/108685/showart_2127853.html 信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程, ...
- linux互斥锁和条件变量,如何理解互斥锁和条件变量?
下面的代码出自<Unix/Linux编程实践教程>,作用是用两个线程分别统计两个文件的单词的数目,并在主线程中计算总数.下面是运行截图: 但是看了半天还是难以理解下面代码中的加锁.解锁以及 ...
- 【C++】多线程互斥锁、条件变量
我们了解互斥量和条件变量之前,我们先来看一下为什么要有互斥量和条件变量这两个东西,了解为什么有这两东西之后,理解起来后面的东西就简单很多了!!! 先来看下面这段简单的代码: int g_num = 0 ...
- Linux多线程同步------条件变量
先来看下<Linux高性能服务器编程>中对条件变量的描述: 上述话可以总结为: 多线程中某一个线程依赖于另外一个线程对共享数据的改变时,就可以使用条件变量! 用消费者生产者的来理解条件变量 ...
- C++ 多线程:条件变量 std::condition_variable
文章目录 描述 使用 描述 头文件<condition_variable> 定义 class condition_variable; 简介 之前我们也已经介绍过了C++多线程中互斥变量存在 ...
- 【C++】多线程与条件变量【三】
文章目录 1 条件变量是什么? 实例1: 2 条件变量本质? 3 引入条件变量的原因? 实例2: 实例3: 实例4: 4 如何使用条件变量? 4.1 std::condition_variable 实 ...
- Linux下多线程编程互斥锁和条件变量的简单使用
Linux下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,链接时需要使用库libpthread.a.线程是进程的一个实体,是CPU ...
- C++条件变量使用详解
1. condition_variable介绍 在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作:当条件不满足时,相关线程被一直阻塞,直到某种条件出 ...
最新文章
- Matlab数据的可视化 -- 极坐标图及其与直角坐标图的转换
- python把矩阵存为文件_python 读取文件并把矩阵转成numpy的两种方法
- 设计模式:设计模式七大原则之迪米特法则
- SpendidCRM:在admin-layout中修改了视图上的字段后,用MyGeneration生成修改脚本
- Dubbo-go 源码笔记(一)Server 端开启服务过程
- java关键字与标识符 —(3)
- hive与依赖环境的交互
- 优酷下载的视频保存在哪里
- virus.win32.xorer病毒
- 3.6. Pure-FTPd + LDAP + MySQL + PGSQL + Virtual-Users + Quota
- 分布式和微服务区别_分布式、集群、微服务到底有啥区别?
- 中国最惨创业者的惨痛教训!
- 一款支持vue3 的颜色选择器
- OpenCV调用工业相机
- 鸿雪因缘--穿越千年的朋友圈
- 2、51单片机——I2C 总线
- Day 20 IOl流
- 今日学习在线编程题:弓形半径
- Android Service startForeground不显示Notification的办法
- 台式计算机和笔记本,大一买买笔记本还是台式电脑好?
热门文章
- 嵌入式Linux下彩色LCD驱动的设计与实现
- 数据结构在游戏中的简单应用
- php debug 打印变量_打印变量到页面上的方法 PHP debug函数
- 空间后方交会c++程序和matlab(可直接运行)
- 关于内存和内存地址的详解
- cf551-brother_acm训练题解
- php soapclient xml,PHP SoapClient请求
- 高德地图通过基站信息获取经纬度和具体位置
- 2022重构版Xiuer抖你妹套图WordPress主题源码
- java removeattribute_springboot使用shiro后HttpSession的removeAttribute无效