Linux线程的设计

news2024/11/29 20:33:51

在这里插入图片描述

文章目录

  • 一.理解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.coloradmin.cn/o/1318143.html

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

相关文章

IIS如何本地部署网站,作为局域网内的服务器

文章目录 IIS本地部署WebService1.使用IIS及WebService的原因:2.相关文件说明及网络条件说明&#xff1a;&#xff08;1&#xff09;文件说明&#xff1a;&#xff08;2&#xff09;网络条件说明&#xff1a; 3.IIS安装与配置&#xff1a;第一步&#xff1a;安装第二步&#xf…

全国职业院校技能大赛“大数据应用开发”赛项说明

1、赛项介绍 &#xff08;1&#xff09;赛项名称 全 国 职 业 院 校 技 能 大 赛 “大数据应用开发” 赛 项 职业院校技能大赛官网 (vcsc.org.cn)https://www.vcsc.org.cn/ 大赛组织机构介绍 全国职业院校技能大赛(以下简称大…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言&#xff1a; ​ 关于本篇笔记&#xff0c;参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知&#xff0c;一方面也想为大家解决在爬虫技术区的一些问题&#xff0c;本篇文章所使用的环境为&#x…

网络攻击1——网络安全基本概念与终端安全介绍(僵尸网路、勒索病毒、木马植入、0day漏洞)

目录 网络安全的基本术语 黑客攻击路径 终端安全 僵尸网络 勒索病毒 挖矿病毒 宏病毒 木马的植入 0day漏洞 流氓/间谍软件 网络安全的基本术语 网络安全的定义&#xff08;CIA原则&#xff09; 数据的保密性Confidentiality&#xff08;对称/非对称秘钥&#xff09; …

mysql innodb知识记录

官方文档 官网架构图 innodb 特性 内存 buffer pool 采用优化后的LRU算法&#xff0c; 3/8 of the buffer pool is devoted to the old sublist.The midpoint of the list is the boundary where the tail of the new sublist meets the head of the old sublist.When In…

C语言-Makefile

Makefile 什么是make&#xff1f; make 是个命令&#xff0c;是个可执行程序&#xff0c;用来解析 Makefile 文件的命令这个命令存放在 /usr/bin/ 什么是 makefile? makefile 是个文件&#xff0c;这个文件中描述了我们程序的编译规则咱们执行 make 命令的时候&#xff0c; m…

[DroneCAN]CAN-Convertor控制CAN电调电机

简介 CAN电调电机是一类通过CAN协议控制转速的电调电机&#xff0c;和传统的PWM电调电机不同在于&#xff0c;CAN协议有网络性和抗干扰性&#xff0c;因此其性能比PWM更好&#xff0c;占用的端口数也会更少。在apm或者px4等基于dronecan的飞控来说&#xff0c;想要控制第三方的…

【CMU 15-445】Lecture 10: Sorting Aggregations Algorithms 学习笔记

Sorting & Aggregations Algorithms SortingTop-N Heap SortExternal Merge Sort2-WAY External Merge SortK-WAY External Merge SortDouble Buffering Optimization AggregationsSortingHashing 本节课主要介绍的是数据库系统中的排序算法以及聚合算法 Sorting 排序算法…

大模型自定义算子优化方案学习笔记:CUDA算子定义、算子编译、正反向梯度实现

01算子优化的意义 随着大模型应用的普及以及算力紧缺&#xff0c;下一步对于计算性能的追求一定是技术的核心方向。因为目前大模型的计算逻辑是由一个个独立的算子或者说OP正反向求导实现的&#xff0c;底层往往调用的是GPU提供的CUDA的驱动程序。如果不能对于整个计算过程学习…

LearnDash LMS ProPanel在线学习系统课程创作者的分析工具

点击阅读LearnDash LMS ProPanel在线学习系统课程创作者的分析工具原文 LearnDash LMS ProPanel在线学习系统课程创作者的分析工具通过整合报告和作业管理来增强您的 LearnDash 管理体验&#xff0c;使您能够发送特定于课程的通信&#xff0c;并显示课程的实时活动&#xff01…

分类信息网商业运营版源码系统:适合各类行业分类站点建站 带安装部署教程

随着互联网的快速发展&#xff0c;信息分类网站在各个行业中得到了广泛应用。为了满足不同行业的需求&#xff0c;罗峰给大家分享一款适合各类行业分类站点建站的商业运营版源码系统。该系统旨在提供一套完整的解决方案&#xff0c;帮助用户快速搭建自己的分类信息网站&#xf…

【最新版】在WSL上运行 Linux GUI (图形用户界面)应用(Gnome 文本编辑器、GIMP、Nautilus、VLC、X11 应用)

文章目录 一、 安装WSL0. 先决条件1. 全新安装2. 现有 WSL 安装3. 注意事项 二、运行 Linux GUI 应用1. 更新发行版中的包2. 安装 Gnome 文本编辑器启动 3. 安装 GIMP启动 4. 安装 Nautilus启动 5. 安装 VLC启动 6. 安装 X11 应用 适用于 Linux 的 Windows 子系统 (WSL) 现在支…

Javaweb考前复习冲刺(不断更新版)

Javaweb考前复习冲刺 第一章&#xff1a; JavaWeb 入门 JavaWeb是指&#xff1a;以Java作为后台语言的项目工程。 javaweb项目创建的过程&#xff1a; 首先集成Tomcat服务器环境新建dynamic web project部署工程运行 路由含义&#xff1a; ​ http://localhost:8080/工程…

Redis 主从集群 —— 超详细操作演示!

五、Redis 主从集群 五、Redis 主从集群5.1 主从集群搭建5.1.1、伪集群搭建与配置5.1.2、分级管理5.1.3、容灾冷处理 5.2 主从复制原理5.2.1、主从复制原理5.2.2、数据同步演变过程 5.3 哨兵机制实现5.3.1 简介5.3.2 Redis高可用集群搭建5.3.3 Redis高可用集群的启动5.3.4 Sent…

ubuntu创建apt-mirror本地仓库

首先创建apt-mirror的服务端&#xff0c;也就是存储所有apt-get下载的文件和依赖。大约需要300G&#xff0c;预留400G左右空间就可以开始了。 安装ubuntu省略&#xff0c;用的是ubuntu202204 ubuntu挂载硬盘&#xff08;不需要的可以跳过&#xff09;: #下载挂载工具 sudo apt…

Java并发(十九)----Monitor原理及Synchronized原理

1、Java 对象头 以 32 位虚拟机为例 普通对象 |--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark W…

序列生成模型(一):序列概率模型

文章目录 前言1. 序列数据2. 序列数据的潜在规律3. 序列概率模型的两个基本问题 一、序列概率模型1. 理论基础序列的概率分解自回归生成模型 2. 序列生成 前言 深度学习在处理序列数据方面取得了巨大的成功&#xff0c;尤其是在自然语言处理领域。序列数据可以是文本、声音、视…

pytorch和pytorchvision安装

参考https://blog.csdn.net/2301_76863102/article/details/129369549 https://blog.csdn.net/weixin_43798572/article/details/123122477 查看我的版本 右键&#xff0c;nvivdia控制面板&#xff0c;帮助&#xff0c;系统信息 驱动程序版本号为528.49 更新很快的 CUDA版本…

stm32F4——BEEP与按键的实例使用

stm32F4——BEEP与按键的实例使用 蜂鸣器和按键的实质都是GPIO的使用&#xff0c;所以基本原理就不介绍啦&#xff0c;基本寄存器其实都是GPIO的高低电平的赋值&#xff0c;可以参考stm32——LEDGPIO的详细介绍 文章目录 stm32F4——BEEP与按键的实例使用一、BEEP二、 KEY三、通…

MySQL数据库 DML

目录 DML概述 添加数据 修改数据 删除数据 DML概述 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据(工NSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据 (1)给指定字段添加数据 INSERT …