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

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.xdnf.cn/news/18107.html

相关文章:

  • 存储、硬盘、文件系统、 IO相关常识总结
  • Boost库核心组件与应用
  • 图论Day4学习心得
  • MyBatis极速通关中篇:核心配置精讲与复杂查询实战
  • MATLAB R2010b系统环境(二)MATLAB环境的准备
  • 分享一个Oracle表空间自动扩容与清理脚本
  • Docker小游戏 | 使用Docker部署人生重开模拟器
  • 34 HTB Cat 机器 - 中等难度
  • 洛谷B3836 [GESP202303 二级] 百鸡问题
  • Hana IDE 安装吧报错
  • 每日算法刷题Day62:8.16:leetcode 堆8道题,用时2h30min
  • 【数据分享】大清河(大庆河)流域上游土地利用
  • GCN图卷积神经网络的Pytorch实现
  • 摩搭api 实现
  • 【最后203篇系列】032 OpenAI格式调用多模型实验
  • 博弈论07——Lemke-Howson 算法
  • Redis入门与背景详解:构建高并发、高可用系统的关键基石
  • SpringBoot自动配置原理(二)
  • [Linux] RAID存储技术
  • TDengine 3.3.7.0 版新功能(BLOB 数据类型)
  • LangGraph实战指南:如何构建一个深度研究Agent
  • 测试工程师的AI转型指南:从工具使用到测试策略重构
  • MySQL 配置性能优化赛技术指南
  • H20芯片与中国的科技自立:一场隐形的博弈
  • K8S HPA 弹性水平扩缩容 Pod 详解
  • 力扣 hot100 Day75
  • C#WPF实战出真汁08--【消费开单】--餐桌面板展示
  • implement copy file content to clipboard on Windows
  • 某智慧教育平台登录流程分析
  • php版的FormCreate使用注意事项