当前位置: 首页 > news >正文

线程同步条件变量

为何要线程同步

在线程互斥中外面解决了多线程访问共享资源所会造成的问题。

这篇文章主要是解决当多线程互斥后引发的新的问题:线程饥饿的问题。

什么是线程饥饿?互斥导致了多线程对临界区访问只能改变为串行,这样访问临界资源的代码只能一个一个线程访问,如果不加以限制就会导致无序的争抢资源,并且当资源还未准备就绪的情况下也会不停的加锁解锁,浪费CPU资源。 

第一个问题无序存在,在循环中,有可能会导致部分优先级低的线程无法访问到锁从而无法访问到临界资源,我们称之为线程饥饿。

第二个问题临界资源未就绪,只有互斥的情况下线程只能循环加锁解锁访问,无法等待就绪情况。

条件变量

线程同步的一种方法。

先说接口

变量类型

pthread_cond_t cond;

条件变量类型是线程库中的自定义类型名。

初始化条件变量

int pthread_cond_init (pthread_cond_t * __cond,const pthread_condattr_t * __cond_attr)

初始化条件变量,第二个属性设为nullptr

析构条件变量

int pthread_cond_destroy (pthread_cond_t *__cond)

当不再使用条件变量,请析构

等待条件满足

int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t* mutex); 

发送条件

参数: cond:要在这个条件变量上等待 mutex:互斥量,条件变量也是共享数据需要锁的保护。

条件变量其实类型队列的存入与取出

//唤醒等待
int pthread_cond_broadcast(pthread_cond_t *cond);//唤醒全部
int pthread_cond_signal(pthread_cond_t *cond);//唤醒一个

唤醒队列中等待的线程。

画图,解释流程

 当临界资源未就绪下

 

 

 

http://www.lryc.cn/news/127754.html

相关文章:

  • jeecgboot-vue3 查询区 label 文字居左实现
  • CentOS系统环境搭建(五)——Centos7安装maven
  • .eslintrc配置
  • LangChain手记 Models,Prompts and Parsers
  • Cannot resolve plugin ... maven插件和依赖无法下载解决方法
  • 【skynet】skynet 服务间通信
  • Flink的Standalone部署实战
  • open cv学习 (一)像素的操作
  • 基于C#的消息处理的应用程序 - 开源研究系列文章
  • C语言刷题指南(一)
  • VMware虚拟机Ubuntu无法连接网络的解决方法
  • 基于CentOS 7 部署社区版Haproxy
  • Git和GitHub
  • spring入门基本介绍及注入方式---详细介绍
  • 神经网络基础-神经网络补充概念-24-随机初始化
  • K8S之存储卷
  • 8月17日,每日信息差
  • VBA技术资料MF44:VBA_把数据从剪贴板粘贴到Excel
  • nestjs:nginx反向代理服务器后如何获取请求的ip地址
  • STM32 F103C8T6学习笔记7:双机无线串口通信
  • 开源数据库Mysql_DBA运维实战 (DDL语句)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略
  • 从源代码编译构建Hive3.1.3
  • 探索性测试及基本用例
  • MYSQL 作业三
  • 【深度学习 | 感知器 MLP(BP神经网络)】掌握感知的艺术: 感知器和MLP-BP如何革新神经网络
  • Kali Linux中常用的渗透测试工具有哪些?
  • SpringBoot案例 调用第三方接口传输数据
  • 第三章,矩阵,08-矩阵的秩及相关性质
  • VS2019 + Qt : setToolTip的提示内容出现乱码