linux的线程概念

news2025/2/6 7:56:16

目录

1.原理

2.线程的周边概念

3.创建线程的接口

1.pthread_create

2.pthread_join

3.pthread_detach

4.终止线程

5.C++11封装的多线程库

4.线程库的大概结构

5.__thread(只能修饰内置类型)

6.线程的互斥

1.了解原理

2.加锁

1.接口

2.代码示范

3.相关问题

2.锁的原理

3.封装锁


1.原理

这理解线程,一定要理解进程的原理。我们先来简单看一下进程的原理图:

地址空间是进程的资源窗口,那如何理解线程呢?线程:是进程内的一个个的执行分支。线程的执行粒度要比进程更细!

而这些线程都是执行流,因为cpu只有调度执行流的概念。所以在linux中的执行流可以说是轻量级的进程:线程<=执行流<=进程(如果该进程只有一个线程,则线程就是进程就是执行流,但是该进程有多个线程,则线程就是执行流)。但是注意在其他环境下(比如windows)就不是这样管理线程的,而是:

这样就其他的增大了管理线程的代价,而linux就发现线程和进程的pcb差不多,所以就一同规定了!

linux的实现方案:
1.在linux中,线程在进程“内部”执行,线程在进程的地址空间内运行----任何执行流要执行都要资源!地址空间是进程的资源窗口,就当做共享的了!

2.在linux中,线程的执行粒度要比进程要更细-----线程执行进程代码的一部分。

2.线程的周边概念

其实共享的还有:栈,寄存器,线程id,一组寄存器,errno,信号屏蔽字,调度优先级。

3.创建线程的接口

由于linux没有很明确的线程的概念,只有轻量级进程(线程)的概念。所以不会直接提供给我们线程的系统调用,只有轻量级进程的接口,我们需要的是线程的-------因此pthread线程库,在应用层给我们封装了线程的库。(几乎所有的linux平台,都是默认自带这个库的)

1.pthread_create

第一个参数--输出型参数thread id(告诉主线程开辟的线程id),第二个---是开辟新线程的属性,一般是设为nullptr,用默认的属性就好,第三个参数就是要新线程执行的任务函数,第四个就是要传入这个函数的形参。

注意左边的id是用户级的线程id,而右边的LWP是内核级的线程id

2.pthread_join

和子进程一样,线程结束不回收的话,可能会导致内存泄露。

第二个参数是知道线程执行函数的返回值的。返回的是void*,那么要在pthread_join的retval的输出型参数获得的话,就要是void**。

但是我们发现,我们之前了解过进程有三种结束状态,1.代码没跑完,2.代码跑完,输出码异常3.代码跑完,输出码正常。那如果线程中途出异常了怎么办?

次线程出异常,整个进程将全部结束!

3.pthread_detach

这是让主线程不需要等待其他线程的函数:

4.终止线程

5.C++11封装的多线程库

如果你的代码需要在多个平台下运行的话,就使用C++封装的库,每当使用这些库时,里面都是加载相对应打开该环境下线程的库,所以才说C++是支持跨平台的,如果你使用上面的函数在vs编译器(window环境)是绝对不可能运行的起来的!

4.线程库的大概结构

其实这个函数才是最底层的函数,fn就是thread_create的第三个参数,child_stack就是内部自定义一个栈。flags其实是问你要不要和地址空间实现共享,我们默认都是要的!

那么如何先描述再组织的呢?

5.__thread(只能修饰内置类型)

上面代码的g_val全局变量肯定是被共享的,但是__thread修饰过之后,就可以变成全局变量,但是被每个线程独有的:

那有什么用呢?我们线程里面函数定义变量也可以啊,况且还不能修饰自定义类型。但是如果在线程执行的函数里面,还包含函数,并且需要用到这个变量,那是不是就只能通过传参的方式来使用,但是这个就可以少传点参数了!

6.线程的互斥

先看一下接下来的代码:

我们已经判断ticket>0了,为什么还会出现这个情况?

1.了解原理

但是由于上面这种情况发生的概率很小,所有就用了上面的代码来解释:

线程1判断ticket>0刚好时间片结束,然后给线程2,此时还没有进行ticket--操作,依旧可以进入if语句,所以才导致了这个现象!

2.加锁

1.接口

pthread_mutex_t就是结构体,init和destroy就是初始化和删除,但是如果把该结构体=PTHREAD_MUTEX_INITIALIZER就不需要初始化和删除了。

pthread_mutex_lock 和unlock两个函数中间就是加锁的区间。

2.代码示范

但是看结果发现:抢票的都是2号线程,原因是2号线程抢到锁之后,在释放锁的同时又申请锁了。所以我们需要改进一下:

3.相关问题

1.申请锁成功,才能往后执行,不成功,阻塞等待。但是在临界区中,线程可以被切换吗?答案是肯定的,如果你临界区代码多,cpu也不可能只给你运行一个。当然切换的肯定是其他的线程,那些没有锁的线程肯定还在堵塞当中。所以当前线程访问临界区的过程,对于其他线程是原子的。

2.但是锁本身就是共享资源,所以申请锁和释放锁本身就是被设计成为了原子性操作,那是如何做到的呢?

2.锁的原理

movb就是将当前线程的al寄存器中的值制0,然后将mutex内存中的值做交换---exchgb。这条指令才是最重要的,本质就是把数据交换到线程的硬件上下文。所有寄存器每个cpu中只有一份但是内容是更着线程走的!所以一旦交换后,不管你线程怎么切换,其他线程拿到手的mutex都是0,只有那一个线程中的al寄存器中的值是1.---把一把共享锁,让一个线程以一条汇编的方式,交换到知己的上下文当中。

看到解锁是movb而不是xchgb,所以可以看的出来,不一定要同一个线程来解锁,这样可以避免拿到锁的线程万一直接bebug,还把锁拿走了,所以我们可以通过别的锁来解。

3.封装锁

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

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

相关文章

护网 | 如何从蓝队初级进化到蓝队中级

了解应急响应的流程 1&#xff09;首先判断服务器资产、影响范围以及严重程度&#xff0c;确认有没有必要将服务器下线隔离&#xff0c;然后根据服务器的失陷时间和态势感知的告警&#xff0c;判断是由什么漏洞进来的 2&#xff09;其次就是取证排查阶段&#xff0c;如果是w…

get_program_dir() Ai回答是一个函数,用于获取当前程序.exe的目录。

#include <iostream> #include <filesystem>std::string get_program_dir() {return std::filesystem::current_path().string(); }int main() {// 调用函数获取当前程序的目录std::string program_dir get_program_dir();std::cout << "当前程序的目录…

认识一下RAG

1.RAG技术背景与挑战 2.RAG的核心概念 3.RAG的工作流程与架构 4.RAG的优化方法 RAG的提出 •Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks是一篇重要的论文(2020年5月) •REALM: Retrieval-Augmented Language Model Pre-Training (2020)就将BERT预训练模…

Go微服务: 服务限流原理, 负载均衡与API网关

微服务里面的限流 (uber/limit)概述 go 微服务保稳三剑客: 熔断&#xff0c;限流&#xff0c;负载均衡限流的作用 限制流量&#xff0c;在服务端生效 注意&#xff1a;熔断是客户端生效 保护后端服务 餐厅吃饭排队的问题&#xff0c;提供凳子&#xff0c;让等候&#xff0c;这就…

创建k8s deploy yaml文件的imagePullSecrets语句

镜像仓库是harbor kubectl create secret docker-registry key --docker-server192.168.0.190 --docker-usernameadmin --docker-passwordHarbor12345

【网络安全入门】什么是网络安全?

如今&#xff0c;组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故&#xff0c;以及来自黑客或竞争对手攻击等防御和恢复能力。而后者包…

解析数据科学,探索ChatGPT背后的奥秘

在当今这个由数据驱动和AI蓬勃发展的时代&#xff0c;数据科学作为一门融合多种学科的综合性领域&#xff0c;对于推动各行各业实现数字化转型升级起着至关重要的作用。近年来&#xff0c;大语言模型技术发展态势强劲&#xff0c;为数据科学的进步做出了巨大贡献。其中&#xf…

如何保护企业邮箱数据安全?看这里

在数字化时代&#xff0c;电子邮件已成为日常生活和商务交流的重要工具。然而&#xff0c;随着网络威胁的日益严峻&#xff0c;确保电子邮件通信的安全性至关重要。在此背景下&#xff0c;电子邮件SSL证书&#xff08;Secure Sockets Layer Certificate&#xff09;作为一项关键…

面试算法-175-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视…

架构设计-灰度发布系统架构设计

灰度发布的定义 互联网产品需要快速迭代开发上线&#xff0c;又要保证质量&#xff0c;保证刚上线的系统&#xff0c;一旦出现问题可以很快控制影响面&#xff0c;就需要设计一套灰度发布系统。 灰度发布系统的作用&#xff0c;可以根据配置&#xff0c;将用户的流量导到新上…

vue webpack打包配置生成的源映射文件不包含源代码内容、加密混淆压缩

前言&#xff1a;此案例使用的是vue-cli5 一、webpack源码泄露造成的安全问题 我们在打包后部署到服务器上时&#xff0c;能直接在webpack文件下看到我们项目源码&#xff0c;代码检测出来是不安全的。如下两种配置解决方案&#xff1a; 1、直接在项目的vue.config.js文件中加…

微信预约怎么做_体验便捷的服务

在这个快节奏的时代&#xff0c;时间显得格外珍贵。无论是工作还是生活&#xff0c;我们都渴望能够用最短的时间完成更多的事情。在这样的背景下&#xff0c;微信预约应运而生&#xff0c;成为我们追求高效、便捷生活的新宠。今天&#xff0c;就让我们一起探讨微信预约的魅力&a…

40.原子累加器

java8之后&#xff0c;新增了专门用于计数的类&#xff0c;LongAccumulator,LongAdder的性能高于AtomicLong。 LongAdder 性能 > AtomicLong 性能 性能高的原因&#xff1a;如果都往一个共享变量上面进行累加&#xff0c;那么比较重试的次数肯定就多&#xff1b;如果分成几…

欧拉函数(模板题)

给定 n 个正整数 ai&#xff0c;请你求出每个数的欧拉函数。 欧拉函数的定义 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个正整数 ai。 输出格式 输出共 n 行&#xff0c;每行输出一个正整数 ai 的欧拉函数。 数据范围 1≤n≤100, 1≤ai≤2109 输…

云仓酒庄培训人数破大世界基尼斯纪录,社会影响力持续发酵

近日&#xff0c;云仓酒庄举办的《综合品酒师》培训活动圆满落幕&#xff0c;其参与人数之众&#xff0c;规模之大&#xff0c;成功刷新了大世界基尼斯纪录&#xff0c;引发了社会各界的广泛关注与热烈讨论。这一事件不仅彰显了云仓酒庄在酒类培训领域的专业化与系统化&#xf…

探索C# 11与.NET 7:入门指南与跨平台开发

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

为什么那么多人喜欢Python?学习Python能为我们带来哪些优势?

Python是现在最火的编程语言&#xff0c;没有之一。那么&#xff0c;相对于其他语言&#xff0c;为什么那么多人喜欢Python&#xff1f;学习Python能为我们带来哪些优势&#xff1f;今天&#xff0c;小编就来和大家探讨一下&#xff01; 1、如果想成为一名程序员的话&#xff…

博将资本荣获杭州市清廉民营企业建设示范单位

2024年3月25日&#xff0c;杭州召开全市清廉民营企业建设现场推进会&#xff0c;引导广大民营企业家努力把清廉民企建设成效转化企业发展的强劲动力&#xff0c;形成杭州民营经济领域风清气正的良好生态。省纪委、省委统战部、省工商联相关领导&#xff0c;市直16家相关单位分管…

如何下载省,市,区县行政区Shp数据

摘要&#xff1a;一般非专业的GIS应用通常会用到省市等行政区区划边界空间数据做分析&#xff0c;本文简单介绍了如何在互联网上下载省&#xff0c;市&#xff0c;区县的shp格式空间边界数据&#xff0c;并介绍了一个好用的在线数据转换工具&#xff0c;并且开源。 目录 一、下…

10. Spring MVC 程序开发

本文源码位置: Spring-MVC 1. Spring MVC 概要 摘自Spring官方&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes …