Linux学习之路 - 线程概念补充理解

news2024/9/20 8:09:39

前面介绍了线程的基本概念,下面介绍一下线程在内核中的存在方式。

在OS中,存在着大量的线程,为了管理这些线程,我们必然需要用结构体对其进行描述,然后再组织起来管理。但是在linux中,实际上是不存在线程这个概念的。那么这个结构体是在哪里被管理的呢?

在linux中,实际上不存在线程,OS对底层的系统调用做了封装,打包成.so的动态库。每当我们需要执行可执行程序时,OS会将原生的线程库加载到物理内存当中,然后将物理内存中的数据经页表映射到共享区当中。这样,当我们在调用线程的相关接口时,就直接在地址空间内跳转即可。

实际上,这个结构体就在我们映射的动态库当中。而我们创建线程时的pthread_t其实就是动态库中struct_pthread的地址,如果我们将tid转成16进制,就可以发现。

每当我们创建一个线程时,线程库中就会增加一个类似的结构,所有的线程也就是被这个库所管理起来了。由于库会映射到不同的进程地址空间当中,即使我们在不同的进程中创建线程,线程库也能对这些线程进行管理。

其中struct pthread 中包含了线程的一些属性;线程的栈结构是独立的,哪怕不同线程访问同一个函数中的变量,这些变量也是被不同线程私有的。(如下图)

下面通过一个例子来说明线程的局部存储。

在不同的线程访问全局变量时,所有的线程都可以对该全局变量做修改,且访问的一定是同一全局变量,因为全局变量属于已初始化数据,被所有线程共享。这里我们对全局变量做一定修改,然后让不同线程对其进行访问。

在全局变量前加上一个__thread,然后我们的线程访问全局变量,就会发现这两个函数中的全局变量地址已经不同了,不同的线程中已经私有了一份变量。这种技术,就叫做线程的局部存储,这里__thread是一种g++编译选项。在编译时,全局变量的值会被拷贝到线程的局部存储区域并创建一个变量,然后当线程需要对这个全局变量进行操作时,只会对各自的局部存储区域内对各自的变量进行操作。需要注意的是,局部存储只能存储内置类型数据,其他的不行。

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

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

相关文章

QT 事件 Event 应用

文章目录 一、事件处理过程1. QT 事件应用介绍2. 事件分发过程 二、重写事件案例1. 鼠标事件2. 自定义按钮事件 一、事件处理过程 1. QT 事件应用介绍 众所周知Qt是一个基于C的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流…

【C++】 —— string的使用

前言 string类虽然不在STL的容器中,但string类十分重要,string类是对字符串的存储和相关操作。 basic_string std::basic_string类是C的一个模版类,它支持多种字符类型。 char :用于表示一个字节的字符,使用ASCII编码。…

揭开谜底:用 C 语言打造你的扫雷游戏!

目录 1. 功能概述 用户界面 2. 游戏分析与设计 2.1 数据结构分析 地雷存储: 玩家视图: 2.2 文件结构设计 3. 代码实现 game.h game.c test.c 亮点功能与创新 智慧的较量:核心游戏循环 进阶功能:让游戏更加与众不同 还…

MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例

目录 深入理解 JavaScript 中的 MutationObserver:原理与实战案例 一、MutationObserver 简介 二、MutationObserver 的工作原理 1、基本用法 2、observe 方法的配置项 三、实战案例 案例 1:监控动态内容加载 案例 2:监控属性变化 案…

如何处理模型API速率限制

引言 当我们访问大模型相关的API服务时,通常会遇到速率限制(即限流),它用于防止用户向某个API发送大量请求,防止请求过载,确保每个人都能公平地访问API。 速率限制的方式 速率限制通常有以下几种形式: RPM(request…

连续时间,离散频率 傅里叶

时域周期——不是把一个信号周期化,而是周期信号取一个周期是x(t),对其周期化不会发生时域的重叠。故当接收到信号,在DFT时,以整个接收到的时间信号为周期进行延拓 推导公式时思路:时域卷积周期冲击,用傅里叶变换推导出…

一键智能改写文章,快速提升内容的吸引力

在这个信息如潮水般涌来的时代,优质的内容创作成为了吸引眼球、传递价值的关键。而有时候,我们可能会面临着已有文章需要优化、旧内容需要焕发新活力的情况。此时,一键智能改写文章的工具就如同一位神奇的魔法师,它能帮助我们将文…

基于深度学习的图像分类或识别系统(含全套项目+PyQt5界面)

目录 一、项目界面 二、代码实现 1、网络代码 2、训练代码 3、评估代码 4、结果显示 三、项目代码 一、项目界面 二、代码实现 1、网络代码 该网络基于残差模型修改 import torch import torch.nn as nn import torchvision.models as modelsclass resnet18(nn.Modul…

【C语言】(指针系列2)指针运算+指针与数组的关系+二级指针+指针数组+《剑指offer面试题》

前言:开始之前先感谢一位大佬,清风~徐~来-CSDN博客,由于是时间久远,博主指针的系列忘的差不多了,所以有些部分借鉴了该播主的,有些地方如果解释的不到位,请翻看这位大佬的,感谢大家&…

C++ char*和char[] 可能指向的内存区域详解(附实验)

C char* 指向的内存区域详解 写在前面c内存结构简介指针常量和常量指针简介情况一:char* 指向栈区内容情况二:char* 指向堆区内容情况三:char* 指向常量区内容情况四:char* 指向静态区内容情况五:char* 指向全局区内容…

Scratch游戏-史诗忍者7免费下载

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 作品描述: 在Scratch版本的《史诗忍者7》中,你需要穿越关卡,击败敌人并收集33个水果。通过灵活的操作和精准的攻击,逐步闯过重重难关。游戏中提供了丰富的技…

【GESP】C++一级练习BCQM3005,基本输出语句printf

一道基础练习题,练习基本输出语句printf。 BCQM3005 题目要求 描述 输出表达式1234∗5678的结果。 输入 无 输出 1234∗56787006652 输入样例 无 输出样例 1234 * 5678 7006652 全文详见个人独立博客:https://www.coderli.com/gesp-1-bcqm3005/ 【…

使用 SuperCraft AI 设计书橱模型的指南

在现代家居设计中,书橱不仅是存放书籍的地方,更是展示个人品味和风格的重要家具。借助 SuperCraft AI,你可以轻松设计出独一无二的书橱。以下是详细的步骤指南,帮助你从零开始设计一个理想的书橱。 1. 创建项目 首先&#xff0c…

【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录 一、插入排序 算法思想 二、插入排序 算法步骤 四、复杂度分析 时间复杂度:O(n^2) 空间复杂度:O(1) 稳定性:稳定算法 五、应用场景 💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:探索数据结构…

node卸载流程

步骤: 1.开始中搜素”命令提示符“,并将其以”管理员身份运行“ 在弹出的框中输入cmd,并确认进入”命令提示符“ 2.在里面通过npm config list查看node相关文件路径, 并找到config from与prefix ,后面对应的路径&…

element-plus的菜单组件el-menu

菜单是几乎是每个管理系统的软件系统中不可或缺的,element-plus提供的菜单组件可以快速完成大部分的菜单的需求开发, 该组件内置和vue-router的集成,使用起来很方便。 主要组件如下 el-menu 顶级菜单组件 主要属性 mode:决定菜单的展示模式…

visual studio给项目增加eigen库 手把手教程

Eigen是一个开源的C库,主要用来支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen 除了C标准库以外,不需要任何其他的依赖包。Eigen库3.4.0版本的下载地址为: https://gitlab.com/libeigen/eigen/-/archive/…

qt-creator-10.0.2之后版本的jom.exe编译速度慢下来了

1、Qt的IDE一直在升级,qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本,官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…

清华大佬自曝:接到了省烟草局的offer,我就拒掉了华为!结果华为立马给我申请了特殊涨薪,总包70w是烟草的2倍,这可如何是好?

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)

文章目录 3.4 接口隔离原则(ISP)3.4.1 概述3.4.2 案列 3.4 接口隔离原则(ISP) 接口隔离原则:Interface Segregation Principle,简称ISP 3.4.1 概述 客户端测试类不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接…