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

【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.线程基本概述&#xff1a; 2.线程类型&#xff1a; 3.线程间的共享资源与非共享资源 4.线程原语 1.线程创建函数 2.获取当前线程id的函数 3.回收线程资源 4.将线程设置为分离态 5.结束线程 6.退出线程 线程 1.线程基本概述&#xff1a; 是操作系统能够…...

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…...

国内可以使用的ChatGPT服务【9月持续更新】

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…...

Linux环境Docker安装Mongodb

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

PyTorch 池化层详解

在深度学习中&#xff0c;池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量&#xff0c;同时增强模型的鲁棒性。本文将详细介绍池化层的作用、种类、实现方法&#xf…...

Intel架构的基本知识

1.字节序 CPU的字节序分为LittleEndian和BigEndian。 所谓Endian,就是多字节数据在内存中的排列方式。 例如,假设有一个整数0x11223344: LittleEndian的排列方式是,从内存的低地址开始,依次存放 0x44 0x33 0x22 0x11; BigEndian的排列方式是,从内存的低地址开始,依…...

Element Plus 中Input输入框

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

大模型中常见 loss 函数

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

(十六)Ubuntu 20.04 下搭建PX4+MATLAB 仿真环境(HITL)

在文章&#xff08;十五&#xff09;Ubuntu 20.04 下搭建PX4MATLAB 仿真环境我们学习了如何配置仿真环境&#xff0c;在本节&#xff0c;主要进行HITL的仿真环境搭建。 根据&#xff08;十五&#xff09;Ubuntu 20.04 下搭建PX4MATLAB 仿真环境完成配置到如下界面&#xff1a;…...

Matlab simulink建模与仿真 第十七章(补充离散库和补充数学库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、补充离散库和补充数学库中的模块概览 1、补充离散库 注&#xff1a;每个版本的补充离散库不一定相同&#xff0c;也不是每个版本的库都有如上所有模块。 2、补充数学库 二、离散直接传递函数Ⅱ模块 1、…...

Android Glide:让图片加载从未如此简单

在 Android 开发中,图片加载一直是一个关键环节。无论是从网络还是本地加载图片,都需要考虑到性能、内存管理和用户体验等多个方面。而在这方面,Glide 成为了众多开发者的首选库之一。本文将带你深入了解 Glide 的强大之处,并介绍如何在项目中快速集成和使用 Glide。 为什…...

YOLOv9改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv9目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力,缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制,使空间注意力引导通道注意力增…...

Obsidian 全部笔记共享配置文件,obsidian仓库-文件夹配置统一化

obsidian仓库-文件夹配置统一化 在每次新建obsidian仓库(vaults)时&#xff0c;仓库的主题和快捷键等都需要重新设置&#xff0c;这是因为每次创建新的仓库时 新仓库的配置文件都是默认配置但是如果通过复制粘贴旧配置文件来达到新仓库的配置和旧仓库一致的话&#xff0c;无法…...

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 框架&#xff0c;让前端界面开发变得简单高效。本教程将带你从安装到实战&#xff0c;快速掌握 ElementUI 的核心技巧。 核心内容…...

算法打卡:第十一章 图论part02

今日收获&#xff1a;岛屿数量&#xff08;深搜&#xff09;&#xff0c;岛屿数量&#xff08;广搜&#xff09;&#xff0c;岛屿的最大面积 1. 岛屿数量&#xff08;深搜&#xff09; 题目链接&#xff1a;99. 岛屿数量 思路&#xff1a;二维遍历数组&#xff0c;先判断当前…...

广度优先搜索算法及其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》带你漫游代码世界 在当今的软件开发中,构建并发和分布式系统已经成为常态。然而,在这些系统中,错误的发生频率高且定位困难。如果我们能够深入考虑错误如何在系统中传播,以及最终如何呈现给用户,那么我们就能为自己、团队和用…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...