7.线程的基本概念

7.线程的基本概念

      • **1. 线程的基本概念**
      • **2. 线程与进程的区别**
      • **3. 线程的创建与回收**
      • **4. 线程的参数传递与返回值**
      • **5. 线程的分离属性**
      • **6. 线程的清理函数**
      • **7. 线程与进程的对比**
      • **8. 练习与作业**
      • **9. 总结**


1. 线程的基本概念

  • 线程:线程是轻量级进程,是进程中的多个任务。线程是系统中最小的执行单位。
  • 进程:进程是系统中最小的资源分配单位。
  • 线程的优点
    • 比多进程节省资源。
    • 线程可以共享变量。
  • 线程的缺点
    • 稳定性比进程稍差。
    • 调试相对麻烦(如使用gdb调试线程时需要使用info thread等命令)。

2. 线程与进程的区别

  • 资源
    • 线程共享进程的资源(如内存、文件描述符等)。
    • 线程也有部分私有资源(如栈、寄存器等)。
    • 进程间只有私有资源,没有共享资源。
  • 空间
    • 进程空间独立,进程间不能直接通信。
    • 线程共享进程的地址空间,线程间可以直接通信。

3. 线程的创建与回收

  • 线程创建
    • 函数原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
    • 功能:创建一个线程。
    • 参数:
      • thread:线程ID,由函数返回。
      • attr:线程属性,通常为NULL(默认属性)。
      • start_routine:线程执行的函数(回调函数)。
      • arg:传递给回调函数的参数。
    • 返回值:成功返回0,失败返回错误码。
  • 线程ID
    • 函数原型:pthread_t pthread_self(void);
    • 功能:获取当前线程的ID。
    • 返回值:当前线程的ID。
  • 线程退出
    • 自行退出
      • 函数原型:void pthread_exit(void *retval);
      • 功能:线程自行退出,并返回一个状态值。
      • 参数:retval:线程退出时返回的状态值。
    • 强制退出
      • 函数原型:int pthread_cancel(pthread_t thread);
      • 功能:强制结束指定线程。
      • 参数:thread:要结束的线程ID。
      • 返回值:成功返回0,失败返回错误码。
  • 线程回收
    • 函数原型:int pthread_join(pthread_t thread, void **retval);
    • 功能:回收指定线程的资源,并获取其退出状态。
    • 参数:
      • thread:要回收的线程ID。
      • retval:存储线程退出状态的指针。
    • 返回值:成功返回0,失败返回错误码。

4. 线程的参数传递与返回值

  • 传递参数
    • 传递整数、字符串、结构体等数据。
    • 示例:
      pthread_create(&tid, NULL, fun, (void *)&arg);
      
  • 返回值
    • 通过pthread_exit返回一个指针,主线程通过pthread_join获取该指针。
    • 示例:
      void *fun(void *arg) {
          int *ret = malloc(sizeof(int));
          *ret = 10;
          pthread_exit(ret);
      }
      
      void *retval;
      pthread_join(tid, &retval);
      int result = *(int *)retval;
      

5. 线程的分离属性

  • 设置分离属性
    • 分离属性的线程在结束时自动回收资源,无需pthread_join
    • 方法1:使用pthread_attr_setdetachstate
      pthread_attr_t attr;
      pthread_attr_init(&attr);
      pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
      pthread_create(&tid, &attr, fun, NULL);
      pthread_attr_destroy(&attr);
      
    • 方法2:使用pthread_detach
      pthread_detach(tid);
      

6. 线程的清理函数

  • 注册清理函数
    • 函数原型:void pthread_cleanup_push(void (*routine)(void *), void *arg);
    • 功能:注册线程退出时执行的清理函数。
    • 参数:
      • routine:清理函数。
      • arg:传递给清理函数的参数。
  • 调用清理函数
    • 函数原型:void pthread_cleanup_pop(int execute);
    • 功能:调用清理函数。
    • 参数:execute:非0表示执行清理函数,0表示不执行。

7. 线程与进程的对比

功能进程线程
创建forkpthread_create
获取IDgetpidpthread_self
退出exitpthread_exit
回收资源wait / waitpidpthread_join
强制终止killpthread_cancel
清理函数atexitpthread_cleanup_push

8. 练习与作业

  • 练习1:设计一个多线程程序,至少有三个子线程,每个线程执行不同的任务,并实时打印执行过程,同时标明身份。
  • 练习2:向子线程传递字符串参数,并在子线程中打印输出。
  • 练习3:定义一个结构体,向子线程传递结构体参数,并在子线程中打印输出。
  • 作业1:创建一个多线程程序,至少有10个子线程,每个线程打印不同的数据,并标明身份。
  • 作业2:设计一个多线程程序,主线程获取用户输入并组织成结构体,子线程进行运算后将结果返回给主线程并输出。

9. 总结

  • 线程是轻量级进程,共享进程的资源,适合需要高并发和资源共享的场景。
  • 通过pthread_create创建线程,pthread_join回收线程资源,pthread_exit退出线程。
  • 线程可以传递参数和返回值,支持分离属性和清理函数。
  • 线程与进程相比,调试和稳定性稍差,但在资源利用和效率上有明显优势。

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

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

相关文章

Linux工具使用

1.gcc/g的使用 1.1程序翻译的过程 ①预处理:展开头文件,替换宏,调节编译,去注释。 ②编译:将代码变成汇编语言 ③汇编:将汇编代码变成二进制不可执行的目标文件。 ④链接:将多个我写的多个…

后端token校验流程

获取用户信息 前端中只有 await userStore.getInfo() 表示从后端获取数据 在页面中找到info对应的url地址,在IDEA中查找 这里是getInfo函数的声明,我们要找到这个函数的使用,所以点getInfo() Override public JSONObject getInfo() {JSO…

Python 梯度下降法(二):RMSProp Optimize

文章目录 Python 梯度下降法(二):RMSProp Optimize一、数学原理1.1 介绍1.2 公式 二、代码实现2.1 函数代码2.2 总代码 三、代码优化3.1 存在问题3.2 收敛判断3.3 函数代码3.4 总代码 四、优缺点4.1 优点4.2 缺点 Python 梯度下降法&#xff…

excel如何查找一个表的数据在另外一个表是否存在

比如“Sheet1”有“张三”、“李四”“王五”三个人的数据,“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列,修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的,就能找到两…

2024年数据记录

笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统,笔者原力值超过99.99%的用户 其他年度数据

7层还是4层?网络模型又为什么要分层?

~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 一、为什么要分层 \quad 网络通信的复杂性促使我们需要一种分层的方法来理解和管理网络。就像建筑一样,我们不会把所有功能都混在一起…

JxBrowser 8.2.2 版本发布啦!

JxBrowser 8.2.2 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接:Latent Variable Models for Analyzing DNA Methylation 摘要: 脱氧核糖核酸(DNA)甲基化与细胞分化密切相关。例如,已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此,通过研究DNA…

【综合决策模型】考虑生命周期评估LCA 与多目标优化MOO的综合决策模型MOOLCA

目录 1. 概念和目的1.1 生命周期评估 (LCA, Life Cycle Assessment)1.2 多目标优化 (MOO, Multi-Objective Optimization)1.3 MOOLCA 的目标2. MOOLCA 的组成2.1 生命周期评估模块2.2 优化模块2.3 决策支持模块参考Life Cycle Assessment with Multi-Objective Optimization (M…

系统思考—蝴蝶效应

“个体行为的微小差异,可能在系统中引发巨大且不可预测的结果。” — 诺贝尔经济学得主托马斯谢林 我们常说,小变动带来大影响,这种现象,在复杂系统理论中被称为“蝴蝶效应”:即使极小的变化,也能在动态系…

设计模式Python版 适配器模式

文章目录 前言一、适配器模式二、适配器模式实现三、适配器模式在Django中的应用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…

科研绘图系列:R语言绘制散点图(scatter plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据画图保存图片系统信息参考介绍 科研绘图系列:R语言绘制散点图(scatter plot) 加载R包 library(tidyverse) library(ggthemes) library(ggpubr) libr…

基于单片机的超声波液位检测系统(论文+源码)

1总体设计 本课题为基于单片机的超声波液位检测系统的设计,系统的结构框图如图2.1所示。其中包括了按键模块,温度检测模块,超声波液位检测模块,显示模块,蜂鸣器等器件设备。其中,采用STC89C52单片机作为主控…

P1044 [NOIP2003 普及组] 栈 C语言

P1044 [NOIP2003 普及组] 栈 - 洛谷 | 计算机科学教育新生态 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 pus…

基础项目实战——学生管理系统(c++)

目录 前言一、功能菜单界面二、类与结构体的实现三、录入学生信息四、删除学生信息五、更改学生信息六、查找学生信息七、统计学生人数八、保存学生信息九、读取学生信息十、打印所有学生信息十一、退出系统十二、文件拆分结语 前言 这一期我们来一起学习我们在大学做过的课程…

OpenEuler学习笔记(十七):OpenEuler搭建Redis高可用生产环境

在OpenEuler上搭建Redis高可用生产环境,通常可以采用Redis Sentinel或Redis Cluster两种方式,以下分别介绍两种方式的搭建步骤: 基于Redis Sentinel的高可用环境搭建 安装Redis 配置软件源:可以使用OpenEuler的默认软件源&#…

Python的那些事第六篇:从定义到应用,Python函数的奥秘

新月人物传记:人物传记之新月篇-CSDN博客 目录 一、函数的定义与调用 二、函数的参数 三、返回值(return语句) 四、作用域 五、匿名函数(lambda表达式) 六、总结 Python函数的奥秘:从定义到应用 编程…

vue3的路由配置

先找到Layout布局文件&#xff0c;从中找到左侧边栏&#xff0c;找到下述代码 <SidebarItem v-for"route in noHiddenRoutes" :key"route.path" :item"route" :base-path"route.path" />/** *菜单项 <SidebarItem>: *使用…

VLLM性能调优

1. 抢占 显存不够的时候&#xff0c;某些request会被抢占。其KV cache被清除&#xff0c;腾退给其他request&#xff0c;下次调度到它&#xff0c;重新计算KV cache。 报这条消息&#xff0c;说明已被抢占&#xff1a; WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…

Blazor-@bind

数据绑定 带有 value属性的标记都可以使用bind 绑定&#xff0c;<div>、<span>等非输入标记&#xff0c;无法使用bind 指令的&#xff0c;默认绑定了 onchange 事件&#xff0c;onchange 事件是指在输入框中输入内容之后&#xff0c;当失去焦点时执行。 page &qu…