linux操作系统之线程

  • 1.线程概念

    • 线程是一个轻量级进程,每一个线程都属于一个进程

    • 进程是操作系统资源分配的最小单位,而线程是CPU任务调度的最小单位

    • 线程是一个任务执行的过程,包括创建,调度,消亡

      • 创建:线程空间位于进程空间,进程中的线程,栈区独立,并共享进程中的数据区,文本区,堆区

      • 调度:宏观并行,微观串行,与进程调度保持一致

      • 消亡:线程结束后,需要回收线程空间

  • 2.多线程与多进程区别

    • 执行效率:多线程执行效率高,创建速度快,任务切换快, 多进程效率低;

    • 通信:线程可以共享空间,直接通信(可以使用全局变量), 进程空间独立,不能直接通信(通信必须使用:管道,信号,共享内存...)

    • 安全性:多线程不安全(一个进程异常结束可能会导致进程结束,使其他的线程无法执行)

    • 资源消耗:相比于进程,线程的内存消耗通常会更小,因为线程共享进程的大部分内存空间和资源

  • 3.线程实现接口

    • 线程库

      • pthread_create

        • int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine),(void *), void *arg);

        • 创建一个线程

          • 注意:一次pthread_create执行只能创建一个线程, 每个进程至少有一个线程称为主线程,主进程退出则所有创建的子线程都退出,主线程必须有子线程同时运行才算多线程程序,线程id是线程的唯一标识,是CPU维护的一组数字。

          • 参数:thread:存放线程ID空间首地址,attr:线程的属性(默认NULL),start_routine:线程入口函数地址(函数指针,指向线程任务函数),arg:给线程函数的参数

      • pthread_self

        • pthread_t pthread_self(void);

          • 获取当前线程的线程id

      • pthread_exit

        • void pthread_exit(void *retval);

          • 子线程自行退出

            • 参数: retval 线程退出时候的返回状态,临死遗言。(不能是局部变量的地址)

      • pthread_join

        • int pthread_join(pthread_t thread, void **retval);

          • 通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞

            • 参数:thread 要回收的子线程tid,retval 要回收的子线程返回值/状态

      • pthread_cancel

        • int pthread_cancel(pthread_t thread);

          • 请求结束一个线程

            • 参数:thread 请求结束一个线程tid

  • 4.线程属性

    • 1.可结合性

      • 能被其他线程回收和杀死的线程具有可结合性,在没有被其他线程回收之前,其资源不释放;

      • 使用pthread_join()函数回收,线程默认具有可结合性

    • 2.分离属性

      • 不能被其他线程回收或杀死的线程具有分离属性,其存储资源在终止时被系统自动释放(类似于孤儿进程)

      • 线程结束后空间自动被操作系统回收,无需调用回收线程的接口函数

      • 线程无法在线程结束实现同步,无法回收线程结束状态

      • 设置分离属性,目的线程消亡,自动回收空间

      • int pthread_attr_init(pthread_attr_t *attr);

        • 功能:初始化一个attr的变量

      • int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

        • 功能:把一个线程设置成相应的属性

        • attr,属性变量,有init函数初始化

        • PTHREAD_CREATE_JOINABLE:可结合性

        • PTHREAD_CREATE_DETACHED:设置分离属性

      • pthread_attr_destroy

        • int pthread_attr_destroy(pthread_attr_t *attr);

          • 销毁线程属性

  • 5.线程控制

    • 互斥

      • 互斥机制:

        • 互斥机制 ===》互斥锁 ===》解决多线程操作共享空间引发的资源竞争问题。

        • 在多线程中对临界资源的排他性访问。

      • 多个线程在操作临界资源时存在资源竞争问题;

      • 临界资源:多个线程可以同时访问到的资源,如:共享变量,全局变量,共享内存等。。。

      • pthread_mutex_t mutex;

      • 初始化锁

        • int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex attr_t *attr);

          • 将已经定义好的互斥锁初始化。

      • 加锁

        • int pthread_mutex_lock(pthread_mutex_t *mutex);

          • 用指定的互斥锁开始加锁代码

          • 加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程/线程都不能操作该部分代码,如果该函数在执行的时候,mutex已经被其他部分使用则代码阻塞

      • 解锁

        • int pthread_mutex_unlock(pthread_mutex_t *mutex);

          • 将指定的互斥锁解锁,解锁之后代码不再排他访问,一般加锁解锁同时出现。

      • 销毁

        • int pthread_mutex_destroy(pthread_mutex_t *mutex);

          • 使用互斥锁完毕后需要销毁互斥锁

    • 同步

      • 有一定先后顺序的对资源的排他性访问。

        • 原因:互斥锁可以控制排他访问但没有次序。

      • 信号量的定义

        • sem_t sem;

      • 信号量的初始化

        • int sem_init(sem_t *sem, int pshared, unsigned int value);

          • 将已经定义好的信号量赋值,sem 为要初始化的信号量, pshared = 0 ;表示线程间使用信号量,!=0 ;表示进程间使用信号量,value 信号量的初始值,一般无名信号量

      • 信号量操作

        • 申请一个信号量

          • int sem_wait(sem_t *sem);

        • 释放一个信号量

          • int sem_post(sem_t *sem);

        • 信号量的销毁

          • int sem_destroy(sem_t *sem);

  • to be continue...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/382733.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

【JavaScript】箭头函数

具体讲解 之前写 this 的指向时就提到过箭头函数,但是由于其比较复杂,还是单独开一篇来讲箭头函数。 箭头函数,箭头函数不能作为构造函数,没有原型 prototype,不能 new。 在箭头函数中,this 关键字指向的是…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

vue3 + ts 报错:Parsing error: Unexpected token : eslint

报错:Parsing error: Unexpected token : eslint 解决: 在 .eslintrc.json 文件中加入 "parser": "babel/eslint-parser"配置 “parser”: “babel/eslint-parser” 告诉 ESLint 在检查代码之前,先使用 Babel 的解析器…

Chapter17 表面着色器——Shader入门精要学习

Chapter17 表面着色器 一、编译指令1.表面函数2.光照函数3.其他可选参数 二、两个结构体1.Input 结构体:数据来源2.SurfaceOutput 三、Unity背后做了什么四、表面着色器的缺点 一、编译指令 作用:指明该表面着色器的 表面函数 和 光照函数,并…

Google Chrome 浏览器在链接上点右键的快捷键

如今,越来越多的软件都懒得设个快捷键,就算设置了连个下划线也懒得加了。 谷歌浏览器右键 > 链接另存为... 和 复制链接地址 的快捷键 (如图)

微信小程序开发(百货商战)实战项目的购物车和个人中心的创建

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

一款异次元小清新风格的响应式wordpress个人博客主题

一款异次元小清新风格的响应式个人博客主题。这是一款专注于用户阅读体验的响应式 WordPress 主题,整体布局简洁大方,针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净,简单且响应迅速的博客主题&#x…

iOS开发设计模式篇第一篇MVC设计模式

目录 1. 引言 2.概念 1.Model 1.职责 2.实现 3.和Controller通信 1.Contrller直接访问Model 2.通过委托(Delegate)模式 3.通知 4.KVO 4.设计的建议 2.View 1.职责 2.实现 3.和Controller通信 1. 目标-动作(Target-Action)模式 2…

Jolt路线图

1. 引言 a16z crypto团队2024年7月更新了其Jolt路线图: 主要分为3大维度: 1)链上验证维度: 1.1)Zeromorph:见Aztec Labs团队2023年论文 Zeromorph: Zero-Knowledge Multilinear-Evaluation Proofs from…

什么是PCB流锡槽焊盘/C型焊盘,如何设计?-捷配笔记

在PCB进行机器组装器件时(如波峰焊),为了防止部分需要二次焊接的元器件的焊盘堵孔,就需要在PCB焊盘上面开个过锡槽,以便过波峰焊时,这些焊锡会流掉。开流锡槽就是在焊盘裸铜(敷锡)部…

【MySQL进阶之路 | 高级篇】事务的ACID特性

1. 数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持一致性,同时我们还能通过事务的机制恢复到某个时间点,这样可以保证给已提交到数据库的修改不会因为系统崩溃而丢失。 1.1 基本概念 事务&…

微前端--single-spa

微前端 使用微前端的挑战: 子应用切换,应用相互隔离,互补干扰,子应用之前的通信,多个子应用并存,用户状态的存储,免登。 常用技术方案 路由分发式微前端 通过http服务的反向代理 http {serv…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(二)——带着问题的学习;一刷感受;环境搭建

按照作者在读者寄语中的说法:我们得榨干这本书的知识。 带着问题 为了更好的学习,我们最好带着问题去探索。 第一:核心问题与基础知识 如上图:这本书介绍了SLAM相关的核心问题和基础知识。王谷博士给我们做了梳理:…

人工智能学习笔记 - 初级篇Ⅱ - 图形可视化 - 第5节-设置刻度、刻度标签和网格

微信公众号:御风研墨 关注可了解更多。问题或建议,请公众号留言 文章目录 设置刻度、刻度标签和网格应用背景准备工作操作步骤工作原理补充说明最后 设置刻度、刻度标签和网格 应用背景 在数据可视化中,合理设置刻度、刻度标签和网格是提高…

【BUG】已解决:libpng warning: iccp: known incorrect sRGB profile

已解决:libpng warning: iccp: known incorrect sRGB profile 目录 已解决:libpng warning: iccp: known incorrect sRGB profile 【常见模块错误】 错误原因: 原因分析 解决方案 具体步骤 欢迎来到英杰社区https://bbs.csdn.net/topics…

MySQL第四次作业

(一)建立数据库及表 (二)处理表 1.修改student 表中年龄(sage)字段属性,数据类型由int 改变为smallint 2.为Course表中Cno 课程号字段设置索引,并查看索引 3.为SC表建立按学号(sno)和课程号(cno)组合的升序的主键索引…

python每日学习12:pandas库的用法(1)

python每日学习12:pandas库的用法(1) 安装 pip install pandas设定系统环境 import pandas as pd #设定自由列表输出最多为 10 行 pd.options.display.max_rows 10 # 显示当前 Pandas 版本号 pd.__version__进入jupyter notebook 页面 在终端…

乐室预约小程序的设计

管理员账户功能包括:系统首页,个人中心,公告信息管理,乐室信息管理,乐器分类管理,乐器管理,乐器知识管理,用户管理,用户预约管理,取消预约管理,用…

Rust代码答疑报错|Python一对一辅导答疑

Question 你好,我是悦创。 学员答疑: https://code.bornforthis.cn/?id4e72084d-1eaf-44ed-8067-744671491574https://code.bornforthis.cn/?id664ff169-41d6-409f-a05b-02ed42279759 问题代码: // You can bring module paths into sc…