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

【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储

文章目录

    • 1. 线程分离
      • 1. 为什么要线程分离?
      • 2. 具体使用
      • 3. 为什么有时候分离在调用join 会正常运行?
    • 2. 如何理解线程库?
      • 如何理解 先描述 在组织?
    • 3. C++中使用多线程
    • 4. 线程局部存储
      • 局部变量
      • 全局变量

1. 线程分离

1. 为什么要线程分离?

使用 pthread_join 默认是阻塞的 ,即主线程等待 新线程退出
在这个过程中,主线程会直接卡住,就没办法继续向后运行,也就什么都干不了

若主线程 想做其他事情 ,所以就提出了线程分离的概念


默认情况下,新创建的线程是joinable的
即 线程默认被创建出来时,必须被join的, 若不能被join,线程对应的资源就无法释放,进而造成内存泄漏问题

若不关心线程的返回值,join是一种负担,创建一个线程时,提前告诉它,要分离这个线程

2. 具体使用

输入 man pthread_detach


参数为 要分离线程的线程id

一个线程被分离,就无法再被join,如果join,函数就会报错



刚开始有主线程和新线程,使用pthread_join 使主线程等待新线程退出
随着自定义函数循环结束,将返回值传给join,新线程结束,
在休眠5秒后,主线程结束



由于使用线程分离后,就不能使用pthread_join ,所以运行可执行程序后会报错

3. 为什么有时候分离在调用join 会正常运行?

在自定义函数中自己把自己分离


可执行程序运行后,发现并没有报错,分离和没分离是一样的


线程被创建的时候,谁先执行并不确定
当使用pthread_create 创建线程时,有可能新线程没有跑,而是主线程继续向下执行,进入join,
然后新线程才把自己分离
join时没有分离,join后才进行分离,所以会正常执行程序

2. 如何理解线程库?


在这里插入图片描述
自己形成的可执行程序,要跟库文件关联起来
库要加载到内存中,经过页表映射到地址空间的共享区中

进程中的多线程,可以随时访问库中的代码和数据
每个线程也都可以访问映射过来的pthread库

线程库也需要管理线程,先描述再组织
线程库创建类似的管理线程的TCB


创建进程时,在内核中存在LWP(轻量级进程),为了更好管理LWP,没办法给用提供线程接口,就必须使用pthread库来适配,对线程做管理,与LWP产生关联,包含库中的线程属性 即TCB

在库中通过自己定义的线程控制结构,把内核中的LWP控制起来

如何理解 先描述 在组织?

描述:
struct pthread 描述的是线程的其他的一些属性
线程局部存储 (后面会详细讲)
线程独立的栈
整体红色的框 作为一个结构体 等同于 线程的TCB 结构 进行描述
创建一个线程就有一个红色框


组织:
整体红色的框 作为一个结构体
把 每个结构体想象成数组, 可以聚合在一起
找线程,找红色框的起始地址即可 称为 线程ID
pthread_t 就是一个地址数据,用来标识线程相关属性集合、
这个地址是虚拟地址

3. C++中使用多线程

添加头文件 #include < thread>

使用 thread 创建对象th
想要执行什么方法,可以把方法传入对象中
通过对象 . 的方式 可以调用 join detach 等


c++底层是对原生线程库的封装
所以需要在makefile中添加pthread库


可执行程序即可正常运行

4. 线程局部存储

局部变量

局部变量在每个线程中是私有的


cnt在自定义函数中作为局部变量,属于栈上的
每个线程都有自己的栈,所以cnt属于每个线程都有的



三个线程对应的cnt地址是不相同的
三个线程的栈是不同的,局部变量cnt开辟到不同的栈中
cnt是同一个变量,地址绝对不一样


在自定义函数内定义的 局部变量cnt 是在运行时开辟的
编译时就把代码编译好了
局部变量会转化为汇编,以栈顶或者栈底为参考点 减去或者加上 对应数字 就代表是开辟空间

更改 ebp 和 esp 就可以切换栈
ebp 可以是 线程1 、线程2、线程3的栈底,根据调度的不同 ,在不同的栈中开辟不同的变量

全局变量

默认情况下,全局变量是所有线程共享的


创建全局变量g_val,并对其进行修改


当有多个线程对全局变量修改时,地址是相同的 ,说明全局变量是所有线程共享的


全局变量在已初始化数据段处开辟的空间


若不想g_val 被全局共享 ,则加入 __thread 编译选项
可以构建每个线程之间的局部存储


每个线程对应的地址是不一样的
说明全局变量g_val 在每个线程中各自有一份


修改后的全局变量 在 线程局部存储 当中
将原来的全局变量给 主线程 以及新线程对应的 线程局部存储 都拷贝一份
每个线程都私有一份,所以地址都不一样

相关文章:

【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储

文章目录 1. 线程分离1. 为什么要线程分离&#xff1f;2. 具体使用3. 为什么有时候分离在调用join 会正常运行&#xff1f; 2. 如何理解线程库&#xff1f;如何理解 先描述 在组织&#xff1f; 3. C中使用多线程4. 线程局部存储局部变量全局变量 1. 线程分离 1. 为什么要线程分…...

c++ ffmpeg 浅谈YUV444、YUV422、YUV420(2)

本期将会给大家介绍YUV相关基础知识&#xff0c;同时也介绍威创网络分布式系统的卓越色彩处理技术。 1.什么是YUV色彩空间 2.YUV采样格式 3.YUV不同采样格式对图像画质的影响分析 一、什么是YUV色彩空间? YUV是视频、图片、相机等应用中常常使用的一类图像格式&#xff0c;是…...

Redis在Windows下安装配置教程

Redis是一个开源的高性能键值对存储数据库&#xff0c;常用于缓存、消息队列等场景。本文将介绍如何在Windows系统下安装配置Redis。 1. 下载地址 Redis官方网站提供了Windows版本的安装包下载地址&#xff0c;网址为&#xff1a;https://github.com/tporadowski/redis/relea…...

数据库服务器

数据库服务器&#xff0c;联系Web服务器与DBMS的中间件是负责处理所有的应用程序服务器&#xff0c;包括在web服务器和后台的应用程序或数据库之间的事务处理和数据访问。 基本信息 中文名 数据库服务器 外文名 database server 功能 数据库服务器建立在数据库系统基础上&a…...

VS输出路径和生成事件

在生成时&#xff0c;常常希望输出文件夹整洁&#xff0c;因此需要设置dll或exe输出位置&#xff0c;同时也希望对一些文件做一些特殊操作 VS的 UI 常用缩写 “./”&#xff1a;代表目前所在的目录。 " . ./"代表上一层目录。 “/”&#xff1a;代表根目录。 生成…...

从 WebKit 看浏览器内核架构

浏览器常见的浏览器内核有&#xff1a;Blink、WebKit、Gecko、Trident 等&#xff0c;目前 WebKit 内核占据了非常大的的市场&#xff0c;包括 Chrome、Safari、安卓浏览器等市面上的主流浏览器&#xff0c;都使用了 WebKit 内核。 从 WebKit 看浏览器内核架构 既然 WebKit 这么…...

使用原生的 JavaScript,不依赖于任何特定的库与 ROSBridge进行通信

使用原生的 JavaScript&#xff0c;不依赖于任何特定的库与 ROSBridge进行通信 创建与 ROS 的连接&#xff1a; var rosbridge_url "ws://localhost:9090"; var ws new WebSocket(rosbridge_url);ws.onopen function(event) {console.log(Connected to rosbri…...

MATLAB第十章_图像处理算法

目录 图像处理算法 图像处理基础 图像处理函数 默认显示方式 添加颜色条 显示多帧图像 显示动画 三维材质图像 图像的直方图 灰度变换 均衡直方图 图像处理应用 图像增强 图像重建 图像变换 图像压缩 图像分割 图像边缘检测 图像识别 图像处理算法 图像处理…...

RobotFramework接口测试方案

1. Robot FrameWork介绍 1.1 介绍 Robot Framework是用于验收测试和回归测试的通用测试自动化框架。它使用易于理解的表格数据语法&#xff0c;非常友好的实现了关键字驱动和数据驱动模式。它的测试功能可以通过使用Python或Java实现的测试库进行扩展&#xff0c;用户可以使用…...

chatgpt赋能python:Python中日期转换:从字符串到日期对象

Python中日期转换&#xff1a;从字符串到日期对象 作为一个经验丰富的Python工程师&#xff0c;日期转换在我的日常编码工作中经常遇到。Python提供了一些内置函数和模块&#xff0c;可以将字符串转换为日期对象或将日期对象格式化为特定的字符串。本篇文章将带您深入了解Pyth…...

k8s 1.27新特性in-place使用方法:避坑指南(官方文档有坑,已提issue)

背景 按照官方文档试用新版的in-place特性时&#xff0c;一字不差地执行了&#xff0c;但是却出现了执行失败的情况&#xff1a; 执行kubectl -n qos-example patch pod qos-demo-5 --patch {"spec":{"containers":[{"name":"qos-demo-ct…...

网络传输(传输介质、通信方式、交换方式)

目录 一、传输介质1.双绞线2.网线安装3.光纤4.无线信道 二、通信方式、交换方式1.通信方式2.同步方式3.交换方式 一、传输介质 1.双绞线 双绞线&#xff1a;将多根铜线按规则缠绕在一起&#xff0c;能够减少干扰&#xff1b;分为无屏蔽双绞线UTP和屏蔽双绞线STP&#xff0c;都…...

【Unity】Time.deltaTime有什么用?看完你就明白

大多数刚开始使用 Unity 的人(包括我),都会对Time.deltaTime感到迷惑。 看完本文,你就会明白Time.deltaTime的定义及作用。 1、deltaTime是什么? 根据定义,Time.deltaTime是每一帧之间的时间间隔(以秒为单位)。 这有助于我们使游戏与帧数无关,也就是说,无论 fps 是…...

vue实现用户动态权限登录

一、使用vueelementUI搭登录框架&#xff0c;主要就是1、2、3、4 配置&#xff1a; ①vue.config.js use strict const path require(path)function resolve(dir) {return path.join(__dirname, dir) }// All configuration item explanations can be find in https://cli.v…...

ONNX模型修改为自定义节点

参考一 首先&#xff0c;需要将ONNX模型中的节点修改为自定义节点。要实现这一点&#xff0c;您需要了解自定义节点的定义和如何在ONNX中使用它们。ONNX定义了一个自定义运算符的接口&#xff0c;您可以使用该接口定义自己的运算符&#xff0c;并将其编译为ONNX模型可以识别的…...

内存对齐原则

struct &#xff08;1&#xff09;结构体第一个数据成员放在offset为0的地方&#xff0c;后面每个成员相对于结构体首地址的偏移量&#xff08;offset&#xff09;都是成员大小&#xff08;该变量类型所占字节&#xff09;的整数倍&#xff0c;如有需要编译器会在成员之间加上填…...

Java SPI 一 之SPI(Service Provider Interface)进阶 AutoService

​ 一、SPI&#xff08;Service Provider Interface&#xff09; 1.1 介绍 SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制)&#xff0c;可以用来启用框架扩展和替换组件&#xff0c;其…...

C++ list类成员函数介绍

目录 &#x1f914;list模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;list内存结构图解&#xff1a; &#x1f914; list的成员函数&#xff1a; &#x1f60a;list构造函数&#xff1a; &#x1f50d;代码示例&#xff1a; &#x1f50d;运行结果&…...

【服务器】本地搭建PHP简单Imagewheel私人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…...

第四十二回:DateRangePickerDialog Widget

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍 DateRangePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的DateRangePickerDialog是一种弹出窗口&#xff0c;只不…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...