Linux线程的设计

在这里插入图片描述

文章目录

  • 一.理解Linux线程的本质
    • 进程地址空间是进程访问系统资源的窗口
    • Linux系统中,线程是比进程更轻量级的执行流
  • 二.Linux线程独立运行的原理
  • 三.基础线程控制

一.理解Linux线程的本质

进程地址空间是进程访问系统资源的窗口

在这里插入图片描述

Linux系统中,线程是比进程更轻量级的执行流

  • 线程是进程内部的执行流,同一个进程中,每个线程有独立的task_struct内核数据结构对象,但是进程地址空间是共享的,因此可以认为,同一个进程中的多个线程共享所有的代码和数据,线程间天然可通信,具有较高的耦合度
  • 线程是内核中进行执行流调度的基本单位,进程是内核中分配系统资源的基本单位
  • 一个进程中,所有线程共享进程的CPU调度时间片
    在这里插入图片描述
  • 线程间进行调度切换时,CPU片内缓存cache的内部数据(通常是一些指令数据)和进程页表无须换出,只需要切换一些寄存器中的执行流上下文信息即可,因此线程间调度切换进程间调度切换的效率要高很多,同时线程占用的系统资源也较少,多线程可以有效提高系统的并发量和运行效率(尤其是在有多个执行流调度队列的多核CPU中)

二.Linux线程独立运行的原理

  • 同一个进程中,多个线程分进程系统资源的本质就是分配进程地址空间
  • 同一个进程中多个线程并发执行时,每个线程都要有自己独立的栈空间来建立函数栈帧执行函数
  • 绝大多数Linux环境中都默认自带POSIX第三方线程库(动态库),Linux环境下编写多线程代码需要调用该库进行线程的创建和维护管理
  • 每一个线程各自的栈空间局部存储变量,由POSIX线程库统一维护在struct pthread结构体中,通过动态库链接的方式,映射到进程地址空间的共享区段(用户本质上也可以自己通过系统调用接口自己维护线程栈局部存储变量,但是比较麻烦,因此有人开发了线程库)
    在这里插入图片描述
  • 主线程栈就是进程地址空间的栈区,其余线程的栈空间统一维护在动态库中,保证了各执行流之间可以相互独立地执行任务

三.基础线程控制

  • 多线程编程中,各个非主线程的代码执行流用函数来进行封装,函数的地址作为参数传递给线程创建接口pthread_create,线程被创建后,其执行流会立即调用指定函数,主线程通过接口pthread_join对其他线程进行阻塞等待以获取执行结果
  • 一个进程中,一旦主线程退出,该进程中的所有线程都会随之退出
    在这里插入图片描述
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <error.h>
#include <stdio.h>
#include <string>//任务请求对象
class Request
{
public:Request(int start, int end, const std :: string &threadname): start_(start), end_(end), threadname_(threadname){}
public:int start_;int end_;std :: string threadname_;
};//请求回应对象
class Response
{
public:Response(int result, int exitcode):result_(result),exitcode_(exitcode){}
public:int result_;   // 计算结果int exitcode_; // 计算结果是否可靠
};//线程的执行流代码
void * SumThread(void * args){Request * Task = static_cast<Request *>(args);Response * Res = new Response(0,0);int begin = Task->start_;int end = Task->end_;for(int i = begin ; i <= end ; ++i){std :: cout << Task->threadname_ << " is runing, Summing..., " << i << std :: endl;Res->result_ += i;        usleep(100000);}//注意使用完请求后释放请求结构体,防止内存泄漏delete Task;return static_cast<void *>(Res);
}int main()
{pthread_t tid;Request *rq = new Request(1, 100, "thread 1");//创建线程并传递计算任务请求pthread_create(&tid, nullptr, SumThread, rq);//用于接收Respond结构体地址void *ret;//pthread_join接口的ret参数用于获取线程函数的返回值,pthread_join接口默认执行阻塞等待pthread_join(tid, &ret);Response *rsp = static_cast<Response *>(ret);std :: cout << "rsp->result: " << rsp->result_ << ", exitcode: " << rsp->exitcode_ << std :: endl;delete rsp;return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac 中文版 Navicat Premium 16 下载安装详细教程

哈喽朋友们大家好&#xff0c;今天做一期 Mac 数据库连接工具 Navicat Premium 16 的安装教程&#xff0c;很多朋友不知道怎么安装的&#xff0c;要不就是有试用期无法正常使用&#xff0c;要不就是英文的&#xff0c;改不了中文&#xff0c;大家可以跟着我的步骤安装&#xff…

RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 RabbitMQ时空之旅&#xff1a;rabbitmq_message_timestamp的奇妙世界 前言什么是rabbitmq_message_timestamprabbitmq_message_timestamp 的定义与作用&#xff1a;如何在 RabbitMQ 中启用消息时间戳&…

视觉检测系统在半导体行业的应用

一、半导体产业链概述 半导体产业链是现代电子工业的核心组成部分&#xff0c;涵盖了从原材料到最终产品的整个生产过程。这个产业链主要分为以下几个环节&#xff1a; 1.原材料供应&#xff1a;半导体行业的基石是半导体材料&#xff0c;如硅片、化合物半导体等。这些材料需要…

挑战52天学小猪佩奇笔记--day24

52天学完小猪佩奇--day24 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day24 的视频内容总结&#xff0c;方便复习。强烈建议大家去关注一波UP&#xff0c;配合UP视频学习。 注&#xff1a;这集开始变成一段一段的猜台词&#xff0c;加…

python学习,1.变量和简单的数据类型

一、编写文章的目的 1.这是为了初学者而写的&#xff0c;学习python比较简单然后上手&#xff0c;也会过滤一些&#xff0c;如果没有提起到的&#xff0c;可以在学习的时候进行补充 2.相对来说&#xff0c;上手难度不会很难。 二、内容 1.让首字母大写&#xff1b;字母都大写…

STM32F103C8T6—烧录程序

STM32F103C8T6烧录程序方法 1. ST-Link烧录程序ST-Link软件下载ST-Link软件安装程序下载 2. 串口烧录程序CH340驱动下载安装连接程序下载 1. ST-Link烧录程序 该USB驱动程序(STSW-LINK009)适用于ST-LINK/V2, ST-LINK/V2-1和STLINK-V3板及其衍生物 首先下载ST-link驱动&#xf…

华为配置基本QinQ示例

组网需求 如图1所示&#xff0c;网络中有两个企业&#xff0c;企业1有两个分支&#xff0c;企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连&#xff0c;且公网中存在其它厂商设备&#xff0c;其外层VLAN Tag的TPID值为0x9100。 现…

解读unity内置的软阴影处理方式

解读unity内置的软阴影处理方式&#xff1a; 参考网址&#xff1a; https://blog.csdn.net/cgy56191948/article/details/105726682 https://blog.csdn.net/weixin_45776473/article/details/119582218 https://tajourney.games/5482/ 上面的博客已经论述了&#xff0c;为何出现…

5个免费、跨平台的SQLite数据库可视化工具

前言 SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;目前最新的版本是 SQLite3。今天推荐5个实用的SQLite数据库可视化工具(GUI)&#xff0c;帮助大家更好的管理SQLite数据库。 什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个…

风速预测(五)基于Pytorch的EMD-CNN-LSTM模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-LSTM模型预测 3.1 数据加载&…

C++软件调试与异常排查技术从入门到精通学习路线分享

目录 1、概述 2、全面了解引发C软件异常的常见原因 3、熟练掌握排查C软件异常的常见手段与方法 3.1、IDE调试 3.2、添加打印日志 3.3、分块注释代码 3.4、数据断点 3.5、历史版本比对法 3.6、Windbg静态分析与动态调试 3.7、使用IDA查看汇编代码 3.8、使用常用工具分…

2023年度佳作:AIGC、AGI、GhatGPT、人工智能大语言模型的崛起与挑战

目录 前言 01 《ChatGPT 驱动软件开发》 内容简介 02 《ChatGPT原理与实战》 内容简介 03 《神经网络与深度学习》 04 《AIGC重塑教育》 内容简介 05 《通用人工智能》 目  录 前言 2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一…

2020年第九届数学建模国际赛小美赛D题石头剪刀游戏与合作解题全过程文档及程序

2020年第九届数学建模国际赛小美赛 D题 石头剪刀游戏与合作 原题再现&#xff1a; 小时候你可能至少玩过几次石头剪刀游戏。在这个游戏中&#xff0c;你几乎有三个选择&#xff0c;每一个都有一个项目要打败&#xff0c;一个项目输给。石头打败剪刀&#xff0c;剪刀剪纸和布覆…

windows电脑半夜突然睡眠自动唤醒的问题查找与治理

遇见几次了&#xff0c;半夜起来上厕所&#xff0c;发现休眠的电脑居然自己开了&#xff0c;还得跑过去把电脑再休眠&#xff0c;很烦。昨天晚上居然自动唤醒两次&#xff0c;忍无可忍了&#xff0c;于是开始查找原因。 查询原因如下&#xff0c;解决方面也在后面。 固件 S3 计…

网络(九)三层路由、DHCP以及VRRP协议介绍

目录 一、三层路由 1. 定义 2. 交换原理 3. 操作演示 3.1 图示 3.2 LSW1新建vlan10、20、30&#xff0c;分别对应123接口均为access类型&#xff0c;接口4为trunkl类型&#xff0c;允许所有vlan通过 3.3 LSW2新建vlan10、20、30&#xff0c;配置接口1为trunk类型&…

一天吃透MySQL面试八股文

目录 事务的四大特性&#xff1f;数据库的三大范式事务隔离级别有哪些&#xff1f;生产环境数据库一般用的什么隔离级别呢&#xff1f;编码和字符集的关系utf8和utf8mb4的区别什么是索引&#xff1f;索引的优缺点&#xff1f;索引的作用&#xff1f;什么情况下需要建索引&…

Python 全栈体系【四阶】(六)

第四章 机器学习 五、线性模型 1. 概述 线性模型是自然界最简单的模型之一&#xff0c;它描述了一个&#xff08;或多个&#xff09;自变量对另一个因变量的影响是呈简单的比例、线性关系。例如&#xff1a; 住房每平米单价为 1 万元&#xff0c;100 平米住房价格为 100 万…

Python计算圆的面积,几何学技法大解析!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python计算圆的面积&#xff0c;几何学技法大解析&#xff0c;全文3800字&#xff0c;阅读大约15分钟。 在本文中&#xff0c;将深入探讨如何使用 Python 计算圆的面积&…

数字化转型导师坚鹏:中国工商银行人工智能与金融数字化转型培训

中国工商银行打造D-ICBC数字化转型战略&#xff0c;围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局&#xff0c;深入推进数字化转型&#xff0c;加快形成体系化、生态化实施路径&#xff0c;促进科技与业务加速融合&#xff0c;以“数字工行”建设推动“GB…

basic_pentesting_1

信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2023-12-11 15:19 CST Nmap scan report for 192.168.1.1 Host is up (0.00023s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report f…