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

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...