Linux多线程——线程的概念和控制

news2024/11/13 19:18:25

文章目录

    • 线程的概念
      • 进程和线程对比
    • 线程的控制
      • 创建线程与分配任务
      • 线程终止
      • 线程等待
      • 线程分离
    • pthread线程库

线程的概念

线程是我们经常听到的一个概念,他和进程有什么关系呢

从操作系统课本里我们可能听说过,线程是一个微缩版的进程,他拥有TCB,不会被分配资源,是CPU进行调度的单位

我们其实可以更直观的理解,程序中的一个执行路线我们就可以称之为线程,也可以说是执行流

那么一个进程他的执行路线至少有一个,也就算做是一个线程,这个进程本身也可以创建分支线程,那么原来的这个进程也就叫做主线程

在Linux中,线程其实没有自己的TCB,而是和进程公用PCB,内存空间也是共享的

因此在Linux中线程其实是要比进程更加轻量化的

每个线程都拥有自己的PCB,但都是自己从主线程中写时拷贝来的

在CPU的视角来看,他的所调度的所有单位都是PCB,是同一个进程,CPU也无法分辨他运行的是线程还是进程

进程和线程对比

线程其实是被CPU调度运行的的基本单位,因为一个CPU只能运行一个执行流

而进程是操作系统分配资源的基本单位,也就是说这个进程和他所属的线程内存空间全部共享,一个全局变量,不同线程之间也能共享

线程也拥有自己的特征数据,否则就无法对线程进行管理了

线程ID,栈区资源,信号屏蔽字,调度优先级

共享的资源和环境有

文件描述符表,信号处理方式,工作目录,用户ID,组ID

我们可以通过ps -aL查看线程ID

请添加图片描述

LWP就是对应进程ID的线程ID

线程的控制

创建线程与分配任务

第三方POSIX线程库在编译时需要引头文件pthread.h,编译选项需要链接库-lpthread

请添加图片描述

一共有四个参数,第一个是线程ID,第二个是选项,目前只设置为空指针即可,第三个选项是需要让新线程走的执行流,第四个是传递给其中的参数

需要注意的是,这个执行流的函数指针是固定的

使用示例

定义参数类

using Tfunc = std::function<void()>;

class TData
{
public:
    TData(const std::string str, const uint64_t time, Tfunc f)
        :TName(str), CreatTime(time), func(f)
    {}
public:
    std::string TName; // 线程名称
    uint64_t CreatTime; // 时间戳
    Tfunc func; // 执行的回调函数
};

void Print()
{
    std::cout<<"线程执行的任务函数"<<std::endl;
}

定义执行流

void* TRountine(void* args)
{
    TData* td = static_cast<TData*>(args); // 安全强制转换
    while(true)
    {
        std::cout<<"name:"<<td->TName<<std::endl;
        std::cout<<"create time:"<<td->CreatTime<<std::endl;
        td->func();
        sleep(1);
    }
    return nullptr;
}

创建参数包,创建子进程

int main()
{
    pthread_t tid;
    TData* TD = new TData("thread 1", (uint64_t)time(nullptr), Print);
    pthread_create(&tid, nullptr, TRountine, TD);

    while(true)
    {
        std::cout<<"这里是主线程"<<std::endl;
        sleep(3);
    }
    return 0;
}

请添加图片描述

手动创建多线程的话,我们可以使用vector对pthread_t进行保存即可

需要注意的是pthread_t和LWP是不同的,除了使用pthread_create里面的第一个输出型参数进行获取,还可以使用pthread_self获取自己的线程id

这个pthread_t的id的本质其实是一个地址

在多线程情况下,一个线程出现中断异常,整个进程都会退出,因为CPU不认识线程!每一种信号的处理方式都是共享的

线程终止

第一种线程终止的方式就是当新线程把自己的有效代码运行完成之后,他就会自动终止,和子进程的逻辑是相同的

如果直接调用exit退出的话,整个进程会直接退出

除此之外我们可以调用pthread_exit让新线程退出

请添加图片描述

这里传递的参数我们直接传nullptr即可

线程等待

线程默认是需要被等待的

当线程退出,没有被等待,就会导致类似进程的僵尸问题

我们可以用pthread_join来等待线程退出

请添加图片描述

例如可以这样使用

pthread_join(tid, nullptr);

效果就类似于waitpid

成功返回0,失败返回错误码

获取的线程返回值是通过第二个参数传递出来的,因为create规定的函数指针类型返回值是void*,因此想要获得这个返回值,就要传递void**进去

那么返回值也可以设计一个类了

线程分离

因为线程出错了其实是影响到整个进程的,所有返回值的意义其实不大,那么要让主线程一直等待就是不合算的事情了,所以就有了线程分离

int pthread_detach(pthread_t thread);

我们可以这样让当前线程和主线程脱离关系pthread_detach(pthread_self());

pthread线程库

线程ID的本质是一个地址,而pthread是一个动态的第三方库

当我们进行编译运行的时候,这个库就会被映射到进程地址空间的共享区里

而进程ID的地址本质就是pthread这个库里,线程集合的其实地址

线程需要维护自己的战区,其实就是pthread来维护的

在这里插入图片描述

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

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

相关文章

vue将二维码做成名片,并且生成图片保存

效果图 1. 安装html2canvas 首先&#xff0c;你需要在你的Vue项目中安装html2canvas。你可以通过npm或yarn来安装它&#xff1a; npm install html2canvas # 或者 yarn add html2canvas2.组件形式 2.1 创建组件 在你的Vue项目中&#xff0c;创建一个新的Vue组件&#x…

YOLO-World: Real-Time Open-Vocabulary Object Detection:实时开放词汇对象检测

YOLO系列探测器已成为高效实用的工具。然而&#xff0c;它们对预定义和训练的对象类别的依赖限制了它们在开放场景中的适用性。针对这一限制&#xff0c;我们引入了YOLO-World&#xff0c;这是一种创新方法&#xff0c;通过视觉语言建模和大规模数据集的预训练&#xff0c;增强…

深度学习入门-10

基于小土堆学习 池化层学习 池化层&#xff08;Pooling Layer&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的一种重要组件&#xff0c;它的主要作用是逐步减小数据的空间尺寸&#xff08;即高度和宽度&#xff09;&#xff0c;以减少网络中参数的数量和计算量&a…

OpenCV绘图函数(2)绘制圆形函数circle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 绘制一个圆。 cv::circle 函数用于绘制一个给定中心和半径的简单圆或填充圆。 函数原型 void cv::circle (InputOutputArray img,Point cen…

a探索Python中的DOM操作神器:pyquery

文章目录 探索Python中的DOM操作神器&#xff1a;pyquery背景&#xff1a;为什么选择pyquery&#xff1f;pyquery是什么&#xff1f;如何安装pyquery&#xff1f;五个简单的pyquery函数使用方法场景应用&#xff1a;pyquery在实际开发中常见bug及解决方案总结 探索Python中的DO…

游泳耳机哪个牌子好?四大爆款游泳耳机实测,优缺点秒懂!

在快节奏的现代生活中&#xff0c;游泳不仅是一种锻炼身体的方式&#xff0c;更是一种放松心情、享受宁静的休闲活动。而音乐&#xff0c;作为情感的载体&#xff0c;其在游泳过程中的陪伴&#xff0c;无疑能够让人更加沉浸于水下的宁静与自由。因此&#xff0c;一款性能优越、…

积鼎科技携手潍柴动力的喷嘴雾化模拟项目荣获2024年数字仿真卓越应用奖

近日&#xff0c;积鼎科技携手潍柴动力股份有限公司&#xff08;以下简称“潍柴动力”&#xff09;&#xff0c;凭借创新的喷嘴雾化一体化模拟仿真项目&#xff0c;其成果价值赢得了行业专家的一致认可&#xff0c;成功荣获2024年度数字仿真科技奖卓越应用奖。潍柴动力作为中国…

唯创知音在线TTS方案简介及测试版操作说明

一&#xff1a;背景介绍 在物联网与智能设备日新月异的今天&#xff0c;音频传输与控制技术成为了提升用户体验的关键环节。WT2605C蓝牙音频更新方案&#xff0c;凭借其强大的功能集与高效的交互设计&#xff0c;为两轮电动车、电子锁、提示器、智能安防等多个领域带来了前所未…

OpenAI将禁止中国使用ChatGPT了,你知道吗?

由于政策、法律原因&#xff0c;2024年7月9日以后OpenAI将禁止中国使用ChatGPT 以及调用相关接口&#xff0c;这样的话国内就没法使用ChatGPT 开发应用了。 不过不要急&#xff0c;国内有很多类似ChatGPT 的AI大模型&#xff0c;比如&#xff1a;文心一言、通义千问、ChatGLM、…

计算机毕业设计选题推荐-救援物资管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

ACCESS 工具注入实战 凡诺靶场

简介 Access数据库注入攻击是一种常见的网络安全&#xff0c;通过注入SQL代码来获取未授权的数据访问权限。这种攻击利用了应用程序与数据库之间的交互漏洞&#xff0c;攻击者通过输入特定的SQL代码片段来操纵数据库查询&#xff0c;从而绕过应用程序的安全机制&#xff0c;获取…

如何把控调整Facebook广告预算的正确时机

对于如何调整Facebook广告预算&#xff0c;之前我们已经出过几篇文章了&#xff0c;关注我们的朋友应该已经有了一定的了解&#xff0c;但对于什么时候该调整预算&#xff0c;什么时候该暂停广告&#xff0c;有些投手可能还无法准确的把控这个时机&#xff0c;特别是有的新手&a…

怎么把mp4转换成mp3?5种转换方法教会你

我们时常需要从视频中提取音频&#xff0c;比如将电影配乐、教学视频中的讲解或是喜爱的歌曲MV转换为MP3格式&#xff0c;以便在不同设备上播放或编辑。那么怎么把一个视频中的音频提取出来变成mp3格式呢&#xff1f;别着急&#xff0c;教大家5种简单高效转换方法&#xff0c;一…

SQLi-LABS靶场36-40通过攻略

less-36 这一关是转义函数换成了mysql_real_escape_string,绕过方法与35关一致 1.判断注入点 2.判断闭合方式 id1A0 -- 3.查看页面回显点 ?id-1%A0%27%20%20union%20select%201,2,3-- 4.查询数据库名 ?id-1%A0%27%20%20union%20select%201,database(),3-- 5.查询数据库的…

Qt20窗口相关位置函数

窗口相关位置函数 知识点geometry.hgeometry.cppmain.cpp运行图 知识点 geometry().x() 多屏幕实现方法 #include <QWidget> #include <QPoint> #include <QScreen> // 假设这个函数是某个QWidget的子类中的成员函数 void MyWidget::showGlobalXPos…

【生日视频制作】美女车模特举牌AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程美女车模特举牌AE模板改字广软件告生成器素材 怎么如何做的【生日视频制作】美女车模特举牌AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

C# for语句

计数循环使用for语句比while语句可读性高 for (int i 0; i < 10; i) { Console.WriteLine("hello"); } 先执行int i0&#xff1b;语句&#xff0c;且只执行一次 判断循环条件 i<10; 语句的结果是否为true&#xff0c;如果为true&#xff0c;先执行循环体…

【MySQL】mysql索引和事务(面试经典问题)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 mysql索引 代价 查看索引 创建索引 删除索引 索引背后的数据结构 B树 B树 B树与B树的区别 B树的优势 mysql事务 事务 涉及的四个核心特性: 隔离性详细解释 脏读 不可重…

阿里巴巴1688 阿里228滑块 网站分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 有相关问题请第一时间头像私信联系我…

前端接口请求与后端交互详解 联调后端取不到值 自己的一点记录写的比较随意 会比较乱但都是干货

响应头&#xff1a; cache-control: 缓存控制 联调后端取不到值&#xff1f;&#xff1f; 无论何种形式传递&#xff0c;后端解析表单信息的时候&#xff0c;会考虑Content-Type。 如果是JSON字符串的话&#xff0c;后端解析payload的内容时候要去解析JSON。 如果是key1val…