linux操作系统之线程

news2024/11/26 22:47:01

  • 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.coloradmin.cn/o/1938437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微积分-微分应用2(平均值定理)

要得出平均值定理,我们首先需要以下结果。 罗尔定理 设函数 f f f 满足以下三个假设: f f f 在闭区间 [ a , b ] [a, b] [a,b] 上连续。 f f f 在开区间 ( a , b ) (a, b) (a,b) 上可导。 f ( a ) f ( b ) f(a) f(b) f(a)f(b) 则在开区间 ( a , b …

【手撕数据结构】拿捏双向链表

目录 链表介绍初始化链表销毁链表查找节点打印链表增加节点尾插头插在指定位置之后插入节点 删除节点尾删头删删除指定位置节点 链表判空 链表介绍 前面说到,链表的结构一共有八种:带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非…

绿色算力|暴雨服务器用芯片筑起“十四五”转型新篇章

面对全球气候变化、技术革新以及能源转型的新形势,发展低碳、高效的绿色算力不仅是顺应时代的要求,更是我国建设数字基础设施和展现节能减碳大国担当的重要命题,在此背景下也要求在提升算力规模和性能的同时,积极探索推动算力基础…

计算机网络参考模型与5G协议

目录 OSI七层参考模型OSI模型vsTCP/IP模型TCP/IP协议族的组成 OSI七层参考模型 分层功能应用层网络服务与最终用户的一个接口表示层数据的表示,安全,压缩会话层建立,管理,终止会话传输层定义传输数据的协议端口号,以及流控和差错校验网络层进行逻辑地址寻址,实现不同网路之间的…

泛型新理解

1.创建三个类,并写好对应关系 package com.jmj.gulimall.study;public class People { }package com.jmj.gulimall.study;public class Student extends People{ }package com.jmj.gulimall.study;public class Teacher extends People{ }2.解释一下这三个方法 pub…

麻省理工学院 - MIT - 线性代数学习笔记

学习视频地址 文章目录 1.01方程组的几何解释2.02矩阵消元3.03乘法和逆矩阵乘法逆 4.04矩阵A的LU分解5.05转置,置换,向量空间置换转置向量空间 6.06列空间和零空间7.07求解Ax0:主变量,特解 1.01方程组的几何解释 对于二元方程组&…

重生之我们在ES顶端相遇第6 章- Dynamic Mapping(动态映射)

思维导图 前言 在第5章,我们说完 ES 常用字段类型。但是,并未跟大家解释,为什么不设置 Mapping,写入的字符串,默认就可以全文搜索。例如 PUT /test4/_doc/1 {"name": "hello world" } GET /test…

Qt开发网络嗅探器01

引言 随着互联网的快速发展和普及,人们对网络性能、安全和管理的需求日益增 长。在复杂的网络环境中,了解和监控网络中的数据流量、安全事件和性能 问题变得至关重要。为了满足这些需求,网络嗅探器作为一种重要的工具被 广泛应用。 网络嗅探…

IoTDB 分段查询语句详解:GROUP BY + 时序语义

GROUP BY 查询子句的时序语义展开,IoTDB 支持的分段方式总结! 存储的数据通过分析来发挥价值,当一组被存储的数据通过查询得到分析后的结果时,这些数据才真正在数据库中实现了价值闭环。 在关系型数据库中,GROUP BY 子…

微信小程序数组绑定使用案例(二)

一、数组事件绑定&#xff0c;事件传递数据 1.wxml <text>姓名&#xff1a;{{name}} </text> <block wx:for"{{list}}"><button bind:tap"nameClick2" data-name"{{item}}">修改:{{item}}</button> </block&…

【BUG】已解决:xlrd.biffh.XLRDError: Excel xlsx file; not supported

已解决&#xff1a;xlrd.biffh.XLRDError: Excel xlsx file&#xff1b; not supported 目录 已解决&#xff1a;xlrd.biffh.XLRDError: Excel xlsx file&#xff1b; not supported 【常见模块错误】 错误原因 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(三)-架构模型和概念

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…

Ubuntu 中默认的 root 用户密码

场景&#xff1a;想要切换root用户&#xff0c;发现得输入密码&#xff0c;以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户&#xff0c;默认会随机生成root用户的密码&#x1f605; Ubuntu 中默认的 root 密码是随机的&#xff0c;即每次开机都…

Golang | Leetcode Golang题解之第263题丑数

题目&#xff1a; 题解&#xff1a; var factors []int{2, 3, 5}func isUgly(n int) bool {if n < 0 {return false}for _, f : range factors {for n%f 0 {n / f}}return n 1 }

数据结构->线性结构->顺序存储->静态链表

一、思路 链表由节点组成。 1、分析需求&#xff0c;画图&#xff1a; 2、定义学生结构体&#xff0c;包含姓名、年龄、性别和下一个学生的指针&#xff1a; #include <stdio.h> #define N 20// 定义性别枚举类型&#xff0c;固定值&#xff0c;不是男就是女 typedef e…

基于Centos7搭建rsyslog服务器

一、配置rsyslog可接收日志 1、准备新的Centos7环境 2、部署lnmp环境 # 安装扩展源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 安装扩展源 yum install nginx -y# 安装nginx yum install -y php php-devel php-fpm php-mysql php-co…

JVM:GraalVM

文章目录 一、介绍1、什么是GraalVM&#xff1a;2、GraalVM版本 二、两种使用模式 一、介绍 1、什么是GraalVM&#xff1a; GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。GraalVM的官网地址&#xff1a;https://www.graa…

我在高职教STM32——串口通信(4)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正因如此,才有了借助 CSDN 平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思的教学设计分享…

十年前的老电脑能装win10吗_十年前的老电脑用U盘安装win10教程

十年前的老电脑能装win10吗&#xff1f;十年前的老电脑只要满足win10最低要求的配置都可以安装win10。安装win10方法很多&#xff0c;有一键重装方法、U盘安装、硬盘安装等方式&#xff0c;但最靠谱的方式还是U盘安装。十年前的老电脑用U盘安装win10首先要将u盘制作成u盘启动盘…

Flutter中GetX的用法(超详细使用指南之路由依赖管理篇)

目录 1.前言 2.GetX 依赖管理概述 1.GetX 依赖管理的基本概念 2.与其他依赖管理工具的比较 3. 基础依赖注入 1.Get.put 2.Get.lazyPut 3.Get.putAsync 4.高级依赖注入 1.使用Get.create 2.依赖生命周期管理 5. 参考资料 1.前言 今天这篇博客主要介绍Getx的三大功能…