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

Linux软件编程:进程与线程(线程的传参、属性、通信(互斥锁、信号量))

一、线程传参

  • 可以通过pthread_create第四个参数实现对线程内部的传参

二、线程属性

(一)线程属性

        1.加入属性:①线程结束需要pthread_join手动回收

                             ②可以回收到线程结束的状态

                             ③可以完成线程间的同步

        2.分离属性:①线程结束后系统自动回收线程空间

                             ②线程结束后,不需要pthread_join手动回收

(二)函数接口

        1.pthread_attr_init

        

        2.pthread_attr_setdetachstate

        3.pthread_attr_destroy

      

三、线程间通信

(一)概念:多个线程间传递信息

(二)方式

        

        1.采用全局变量

                1.1进程是操作系统资源分配的最小单位        

                1.2每个进程空间独立,包含文本段+数据段(全局变量)+系统数据段

                1.3一个进程中的多个线程独享栈空间,文本段、数据段、堆区进程多线程共享

        2.注意:多线程同时操作共享空间会引发资源竞争,需要加上互斥锁解决资源竞争问题

四、互斥锁

  • 解决资源竞争的一种方式,可以看成是一种资源
  • 只能加锁一次,解锁期间不能再次加锁,也不能强制占有一个加锁的锁资源,必须等待锁资源释放,也就是解锁后才能继续操作该锁
  • 加锁和解锁中间的代码成为临界代码,也称为临界区
  • 只能防止多个线程对资源的竞争,不能决定代码的先后执行顺序
  • 原子操作:CPU执行原子操作时无法切换调度任务

(一)使用方式

        1.定义互斥锁(全局变量)

        2.对锁初始化

        3.操作全局资源前先加锁

        4.如果加锁成功则完成对全局资源的操作

        5.如果加锁失败则表示有人占用资源,必须等待其余人释放锁资源才能加锁成功

        6.直到加锁成功使用该全局资源

(二)函数接口

        1.pthread_mutex_init

        2.pthread_mutex_lock

        3.pthread_mutex_unlock

        4.pthread_mutex_destroy

五、死锁

(一)概念:多线程由于加锁解锁错误导致程序无法向下继续运行的状态称死锁状态,简称为死锁

(二)死锁产生的四个必要条件:①互斥性②不可剥夺性③请求保持性④循环等待条件

(三)如何避免死锁

        1.加锁顺序保持一致

        2.使用pthread_mutex_trylock替换pthread_mutex_lock

六、信号量

(一)概念

  • 信号量是一种资源
  • 信号量只能完成四种操作:初始化、销毁、申请、释放
  • 如果信号量资源为0,申请资源会阻塞等待,直到占用资源的任务释放资源,资源数不为0时才能申请到资源并继续向下执行
  • 释放资源不会阻塞

(二)函数接口

        1.sem_init

        2.sem_destroy

        3.sem_wait

  • 申请信号量会让信号量资源数-1
  • 如果信号量资源数为0,则会阻塞等待,直到有任务释放资源,能拿到资源并继续向下执行

        4.sem_post

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

相关文章:

  • 嵌入式硬件篇---电容本质
  • 【图像算法 - 15】智能行李识别新高度:基于YOLO12实例分割与OpenCV的精准检测(附完整代码)
  • Redis-plus-plus 安装指南
  • IOMMU的2级地址翻译机制及多级(2~5)页表查找
  • 区块链技术原理(14)-以太坊数据结构
  • 解决html-to-image在 ios 上dom里面的图片不显示出来
  • 一次性能排查引发的Spring MVC深度思考
  • 31 HTB Union 机器 - 中等难度
  • pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)
  • yolo neck特征融合 浅层特征深层特征
  • Python训练营打卡 DAY 38 Dataset和Dataloader类
  • Linux上管理Java的JDK版本
  • B*算法深度解析:动态避障路径规划的革命性方法
  • Go语言指针与内存分配深度解析:从指针本质到 new、make 的底层实现
  • 【最后203篇系列】032 OpenAI格式调用多模型实验
  • RD-Agent for Quantitative Finance (RD-Agent(Q))
  • Spark Shuffle中的数据结构
  • 亚马逊S3的使用简记(游戏资源发布更新)
  • 后台管理系统-4-vue3之pinia实现导航栏按钮控制左侧菜单栏的伸缩
  • 二进制为什么使用记事本读取会出乱码
  • 密码学入门笔记4:分组密码常见算法1——DES
  • Custom SRP - Baked Light
  • 用Pygame开发桌面小游戏:从入门到发布
  • 搜索 AI 搜索 概率论基础教程第3章条件概率与独立性(二)
  • 概率论基础教程第3章条件概率与独立性(一)
  • 《P4180 [BJWC2010] 严格次小生成树》
  • [极客时间]LangChain 实战课 ----- 代理(上)|(12)ReAct框架,推理与行动的协同
  • Manus AI与多语言手写识别的技术突破与行业变革
  • 《Python学习之字典(一):基础操作与核心用法》
  • 【每日一题】Day5