【Linux】线程(第十六篇)
目录
线程
1.线程基本概述:
2.线程类型:
3.线程间的共享资源与非共享资源
4.线程原语
1.线程创建函数
2.获取当前线程id的函数
3.回收线程资源
4.将线程设置为分离态
5.结束线程
6.退出线程
线程
1.线程基本概述:
是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。ubuntu线程为LWP(轻量级进程)
线程id 为tid
lwp 为 线程编号
查看线程的命令
ps -eLf 查看系统中所有的线程
ps -Lf pid 查看指定进程里的线程
线程与进程的区别
线程与进程的差异:相比于进程而言,线程体积更小更轻量(进程是最小的分配资源的单位,线程是最小的调度单位)
进程创建时,内核对进程进行初始化并分配资源(内核)
线程寄存于进程中,与进程共享资源,线程隶属于进程的一部分
注意:线程既可以使用CPU,当时间片耗尽时产生中断,可以实现保存和恢复处理器现场,满足分时复用原则,为系统调度单位
2.线程类型:
用户级线程、内核级线程、混合型线程
用户级线程:默认系统不支持线程比如UBUNTU,需要安装第三方线程库,使用时因为所有的库内容都在用户层,直接访问即可,无需产生层级转换,切换频率低,运行效率高,速度快。 用户级线程即装即用,系统无需支持线程,对系统依赖较低,有较好的兼容性 用户级线程没有对应的内核对象,无法被系统内核识别,无论线程数量变为多少,也不会改变资源分配策略,无法得到更多的系统资源
内核级线程:系统内置线程原语,无需外部支持即可创建使用线程,线程创建后为每个线程创建内核对象,因为是系统函数,每个函数使用时都会产生系统调用,进行频繁的层级转换,相比于用户级线程,效率更低,执行成本高。 每个线程都有对应的内核对象,系统可识别,内核级线程变多,资源分配调整,该进程可能得到更多的资源,从而缩短整体任务的完成时间
混合型线程:该类线程采纳的用户型与内核型的优点,线程定义在用户层,便于使用,降低切换频率,提高执行效率,为线程创建内核对象,系统可识别,可以获取更多的系统资源
3.线程间的共享资源与非共享资源
共享资源:文件描述符表共享、堆空间共享、全局资源静态资源共享、信号行为共享(捕捉、默认、忽略)、pid(进程id) 非共享资源:线程栈(8M) 、信号屏蔽字非共享、 tid(线程id)、线程调度优先级、ERROR全局变量非共享
ubuntu系统中的全局变量errno 比如int fd = open("files")函数调用失败,将错误号设置到全局的errno变量中,perror(错误处理) 。线程有自己的处理方式,无需用perror 、errono
4.线程原语
POSIX Thread Library (NPTL)使Linux内核可以非常有效的运行使用POSIX线程标准写的程序。
1.线程创建函数
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, //新创建的线程ID指向的内存地址。const pthread_attr_t *restrict attr, //线程属性,默认为NULLvoid *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。);
返回值 成功返回0,失败返回int 错误号,开发者可以通过错误号errono 获取对应得错误信息
const char* strerror(int errono); //该函数参数为错误号,返回字符串错误信息,大多数线程库函数都使用这种错误判断和处理方式
2.获取当前线程id的函数
#include <pthread.h>
pthread_t pthread_self(void);//成功返回当前线程得id
3.回收线程资源
int pthread_join(pthread_t tid, //需要等待的线程,指定的线程必须位于当前的进程中,而且不得是分离线程void **status //线程tid所执行的函数返回值(返回值地址需要保证有效),其中status可以为NULL);
.pthread非linux系统的默认库, 需手动链接-线程库 -lpthread
.指定线程tid进行回收操作,可以回收线程资源以及线程得返回值并传出到status中 .阻塞函数,等待线程结束后进行回收 .如果不进行回收,不仅无法获取线程得返回值,还能产生僵尸线程
只有在pthread_join
函数返回时,该线程才会释放自己的资源。 或者是设置在分离属性的情况下,一个线程结束会立即释放它所占用的资源。
4.将线程设置为分离态
pthread_detach(pthread_t tid);//将一个线程退出状态置为分离态
线程有两种中退出状态,线程默认得退出状态为(回收态 JOIN),另一种为(分离态(DETACHED)) 如果一个线程被设置为分离态线程,那么这个线程结束后系统自动回收该线程资源(无需用户干预),用户无法获取该线程返回值 两种退出状态互斥,如果对已经处于回收阶段得线程设置分离,分离无效,对已经分离成功得线程进行join回收操作,回收操作失败
5.结束线程
pthread_cancel(pthread_t tid); //线程取消,某线程可以用该函数结束另外一个线程
示例:
线程里只有while(1); 调用pthread_cancel 取消线程.实现不了。
原理:pthread_cancel向线程发送事件,如果线程里while(1);则处理不了,线程不能退出。线程出现系统调用时会检测取消事件,否则无法处理 解决办法: pthread_testcancel(); 产生一次系统调用(空调用)。
cancel事件得处理依赖关系调用,如果线程中没有系统调用可能无法被取消结束,通过pthread_testcancel可以产生系统调用
6.退出线程
pthread_exit(void*); 线程退出函数,哪个线程调用哪个线程结束
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <errno.h>
void* mythread(void* lpvoid)
{// pthread_detach(pthread_self());//将线程设为分离态//printf("my thread is running,threadid is %x...\n",(unsigned int)pthread_self());while(1){pthread_testcancel();//系统调用(空调用)}return (void*)1;
}
int main()
{int err;void* revalue;pthread_t tid;err = pthread_create(&tid,NULL,mythread,NULL);//创建线程if(err >0){printf("pthread_create failed is %s\n",strerror(err));exit(0);}//sleep(2);pthread_cancel(tid); //向指定线程发送退出事件pthread_join(tid,(void**)&revalue); //回收线程printf("thread id is %x...,exit return value %ld\n",(unsigned int)tid,(long int)revalue);while(1)sleep(1);return 0;
}
相关文章:
【Linux】线程(第十六篇)
目录 线程 1.线程基本概述: 2.线程类型: 3.线程间的共享资源与非共享资源 4.线程原语 1.线程创建函数 2.获取当前线程id的函数 3.回收线程资源 4.将线程设置为分离态 5.结束线程 6.退出线程 线程 1.线程基本概述: 是操作系统能够…...

2024华为杯研赛E题保姆级教程思路分析
E题题目:高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理,实际上,E题的难度相对来说较低,大家不用畏惧视频的处理,被这个吓到。实际上,这个不难,解决了视频的处理问题,…...

国内可以使用的ChatGPT服务【9月持续更新】
首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…...

Linux环境Docker安装Mongodb
Linux环境Docker安装Mongodb 环境要求拉取指定版本镜像创建映射目录(相当于数据存放于容器外,容器被删除不会影响数据)启动容器 进入mongo命令行为指定db创建新用户查看mongodb的容器id进入命令行查看所有db切换db为指定db创建新用户使用新账…...

PyTorch 池化层详解
在深度学习中,池化层(Pooling Layer)是卷积神经网络(CNN)中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量,同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法…...
Intel架构的基本知识
1.字节序 CPU的字节序分为LittleEndian和BigEndian。 所谓Endian,就是多字节数据在内存中的排列方式。 例如,假设有一个整数0x11223344: LittleEndian的排列方式是,从内存的低地址开始,依次存放 0x44 0x33 0x22 0x11; BigEndian的排列方式是,从内存的低地址开始,依…...

Element Plus 中Input输入框
通过鼠标或键盘输入字符 input为受控组件,他总会显示Vue绑定值,正常情况下,input的输入事件会正常被响应,他的处理程序应该更新组件的绑定值(或使用v-model)。否则,输入框的值将不会改变 不支…...

大模型中常见 loss 函数
loss 函数 首先,Loss 是允许不降到 0 的,模型计算的 loss 最终结果可以接近 0。 可以成为 loss 函数的条件## 常用 loss 以下函数调用基于 Pytorch,头文件导入: import torch.nn as nn 均方差(MSE) nn.…...

(十六)Ubuntu 20.04 下搭建PX4+MATLAB 仿真环境(HITL)
在文章(十五)Ubuntu 20.04 下搭建PX4MATLAB 仿真环境我们学习了如何配置仿真环境,在本节,主要进行HITL的仿真环境搭建。 根据(十五)Ubuntu 20.04 下搭建PX4MATLAB 仿真环境完成配置到如下界面:…...

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)
参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注:每个版本的补充离散库不一定相同,也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…...
Android Glide:让图片加载从未如此简单
在 Android 开发中,图片加载一直是一个关键环节。无论是从网络还是本地加载图片,都需要考虑到性能、内存管理和用户体验等多个方面。而在这方面,Glide 成为了众多开发者的首选库之一。本文将带你深入了解 Glide 的强大之处,并介绍如何在项目中快速集成和使用 Glide。 为什…...
YOLOv9改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块
一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv9目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力,缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制,使空间注意力引导通道注意力增…...

Obsidian 全部笔记共享配置文件,obsidian仓库-文件夹配置统一化
obsidian仓库-文件夹配置统一化 在每次新建obsidian仓库(vaults)时,仓库的主题和快捷键等都需要重新设置,这是因为每次创建新的仓库时 新仓库的配置文件都是默认配置但是如果通过复制粘贴旧配置文件来达到新仓库的配置和旧仓库一致的话,无法…...
c++可视化打印树
#include <iostream> #include <string>// 定义节点结构体 struct Node {std::string data;Node* left;Node* right;Node(const std::string& data) : data(data), left(nullptr), right(nullptr) {} };// 递归打印树 void printTree(Node* root, std::string …...

ElementUI 快速入门:使用 Vue 脚手架搭建项目
文章目录 一 . ElementUI 的基本安装1.1 通过 Vue 脚手架创建项目1.2 在 vue 脚手架中安装 ElementUI1.3 编写页面 ElementUI 是 Vue.js 的强大 UI 框架,让前端界面开发变得简单高效。本教程将带你从安装到实战,快速掌握 ElementUI 的核心技巧。 核心内容…...
算法打卡:第十一章 图论part02
今日收获:岛屿数量(深搜),岛屿数量(广搜),岛屿的最大面积 1. 岛屿数量(深搜) 题目链接:99. 岛屿数量 思路:二维遍历数组,先判断当前…...
广度优先搜索算法及其matlab程序详解
#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 算法用途 广度优先搜索算法的应用 算法思想 广度优先搜索算法的步骤: ①,标号,令。 ②当所有标号为 的、与顶点 相关联的边的端点都已标号时,则停止;否则,把与 相关联的边的未标号的…...

力扣 438找到字符串中所有字母异位词
https://leetcode.cn/problems/find-all-anagrams-in-a-string/ 题目描述 题目分析 异位词所表示的空间 P \text{P} P 即一字符串的所有排列,记 s i \bold{s_i} si为以 s [ i ] s[i] s[i]开头的长度为 plen \text{plen} plen的 s s s子串 故本题可理解为求解 A n s Ans Ans…...

图像滤波---各项异性扩散滤波使用笔记及代码
图像滤波---各项异性扩散滤波使用笔记及代码 一、文章内容介绍二、各项异性扩散滤波和各项同性滤波1、各项同性滤波2、各项异性扩散滤波3、各项异性和各项同性的对比 三、各项异性扩散滤波的原理介绍四、各项异性扩散滤波公式五、公式中的参数使用说明1、扩散速率 λ \lambda λ…...
用Go语言构建健壮的并发系统:深入理解错误传播与处理
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在当今的软件开发中,构建并发和分布式系统已经成为常态。然而,在这些系统中,错误的发生频率高且定位困难。如果我们能够深入考虑错误如何在系统中传播,以及最终如何呈现给用户,那么我们就能为自己、团队和用…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...