linux的线程概念

目录

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.mfbz.cn/a/558828.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

遍历取后端数据推送到地图上,实现图标点标记地图效果

遍历取后端数据推送到地图上&#xff0c;实现图标点标记地图效果 示例链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 踩坑注意点&#xff1a; 1. id: 1 是地图底图的id 后台也返回之后 id直接会有冲突 此时图标标记之后无法单击 相关代码&#xff1a…

异步 IO 机制 io_uring

一、io_uring 原理 如何解决频繁 copy 的问题 → mmap 内存映射解决。 submit queue 中的节点和 complete queue 中的节点共用一块内存&#xff0c;而不是把 submit queue 中的节点 copy 到 complete queue 中。 如何做到线程安全 → 无锁环形队列解决。 二、io_uring 使用 内…

了解 Python 底层的解释器 CPython 和 Python 的对象模型

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、CPython CPython 是 Python 编程语言的官方和最广泛使用的实现。它是用 C 语言编写的&#xff0c;因此得名 “CPython”。作为 Python 生态系统的核心&#xff0c;了解 CPython 的工作原理、主要特…

【新版】系统架构设计师 - 知识点 - 结构化开发方法

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识点 - 结构化开发方法结构化开发方法结构化分析结构化设计 数据流图和数据字典模块内聚类型与耦合类型 架构 - 知识点 - 结构化开发方法 结构化开发方法 分析阶段 工具&#xff1a;数据流图、…

如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

一、开通阿里云OSS对象存储服务 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供 99.995 % 的服务可用性和多种存储类型&#xff0c;适用于数据湖存储&#xff0c;数据迁移&#xff0c;企…

股票战法课程之主力的痕迹

文章目录 1. 主力的操作痕迹2. 主力的建仓2.1 建仓的三种方式2.2 建仓的五个特点2.3 建仓的迹象2.4 建仓的成交量特征 1. 主力的操作痕迹 序号痕迹原因1不跟随大盘节奏筹码都在主力手中2突发利空消息&#xff0c;股价不跌反涨主力被套&#xff0c;不希望散户抛盘3很小的成交量…

智己汽车数据驱动中心PMO高级经理张晶女士受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 智己汽车科技有限公司数据驱动中心PMO高级经理张晶女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“规模化敏捷落地实践”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 2…

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

【Java】Comparable和Comparator的区别

文章目录 区别Comparable示例Comparator示例参考资料 都可以用于排序。都是接口。 区别 Comparable示例 让被排序的类实现 Comparable 接口&#xff0c;重写 compareTo() 方法。 import java.util.*;public class Main {public static void main(String[] args){TreeSet<…

端点安全时刻影响着网络安全,我们应该如何保护

端点&#xff08;Endpoint&#xff09;是网络通信中的一个重要概念&#xff0c;指的是网络通信中的发送或接收信息的设备或节点。在一个网络中&#xff0c;端点可以是硬件设备&#xff08;如计算机、服务器、手机、路由器等&#xff09;&#xff0c;也可以是软件应用或服务。端…

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出) 订阅专栏只能获取一份代码 部分源码 %------

ceph osd分组

一、前言 使用分组可以更好的管理osd&#xff0c;将不同类型的磁盘&#xff0c;分到不同的组中&#xff0c;例如hhd类型的osd分配到hhd组&#xff0c;ssd类型的osd分配到ssd组&#xff0c;将io要求不高的分配到hhd组做存储&#xff0c;io要求高的分配到ssd组做存储 二、配置 查…

Linux驱动开发笔记(一)字符驱动

文章目录 前言一、字符设备驱动程序框架二、基本原理1. 设备号的申请与归还2. 保存file_operations接口3. 设备节点的创建和销毁4. 创建文件设备4.1 mknod4.2 init_special_incode( )函数 5. 查找file_operation接口函数速查表 三、程序编写1. 模块初始化及关闭2. 文件操作方式…

墨子web3时事周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团&#xff0c;凭借其在前沿科技领域的深耕不辍&#xff0c;已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻&#xff0c;集团于今年四月末震撼推出了颠覆性的Web3全套解决方案&#xff0c…

【Godot4自学手册】第三十八节给游戏添加音效

今天&#xff0c;我的主要任务就是给游戏添加音效。在添加音效前&#xff0c;我们需要了解一个东西&#xff1a;音频总线。这个东西或许有些枯燥&#xff0c;如果你只为添加一个音效没必要了解太多&#xff0c;但如果你以后将要经常与音频播放打交道&#xff0c;还是要了解一下…

ARM学习(26)链接库的依赖查看

笔者今天来聊一下查看链接库的依赖。 通常情况下&#xff0c;运行一个可执行文件的时候&#xff0c;可能会出现找不到依赖库的情况&#xff0c;比如图下这种情况&#xff0c;可以看到是缺少了license.dll或者libtest.so&#xff0c;所以无法运行。怎么知道它到底缺少什么dll呢&…

论婚恋相亲交友软件的市场前景和开发方案H5小程序APP源码

随着移动互联网的快速发展和社交需求的日益增长&#xff0c;婚恋相亲交友软件小程序成为了越来越多单身人士的选择。本文将从市场前景、使用人群、盈利模式以及竞品分析等多个角度&#xff0c;综合论述这一领域的现状与发展趋势。 一、市场前景 在快节奏的现代生活中&#xf…

矩阵混乱度(熵值)代码计算

1、先回顾下熵值的数据公式&#xff1a; 2、jax.numpy代码 注意的点&#xff1a;熵值计算的输入的必须是归一化的正值 import jax.numpy as jnp import jax def _entroy(probs):log_probs jnp.log2(jnp.maximum(1.0e-30, probs))mean_sum_plogp jnp.mean(- jnp.sum(log_pro…

面试题:Redis如何防止缓存穿透 + 布隆过滤器原理

题目来源 招银网络-技术-1面 题目描述 缓存穿透是什么&#xff1f;如何防止缓存穿透布隆过滤器的原理是什么&#xff1f; 我的回答 缓存穿透是什么&#xff1f; 攻击者大量请求缓存和数据库中都不存在的key。如何防止缓存穿透 可以使用布隆过滤器布隆过滤器的原理是什么&a…

mysql数据库连接工具(mysql数据库连接工具怎么备份数据不备份表结构)

MySQLWorkbench连接,导入和导出数据库? 1、导出&#xff1a;使用MySQL Workbench连接到MySQL服务器&#xff0c;选择要导出的数据库&#xff0c;右键单击数据库并选择“导出”。选择要导出的表和数据&#xff0c;将导出文件保存为.sql文件。 2、打开MySQL Workbench&#xf…
最新文章