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退出线程。
  • 线程可以传递参数和返回值,支持分离属性和清理函数。
  • 线程与进程相比,调试和稳定性稍差,但在资源利用和效率上有明显优势。

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

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

相关文章

【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用

目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页:Icomi 大家好,我是Icomi,本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出,希望…

Conditional DETR for Fast Training Convergence论文学习

1. 写作背景 最近提出的 DETR 成功地将 transformer 引入到物体检测任务中,获得了很不错的性能。DETR 的重要意义在于去除了物体检测算法里需要人工设计的部分,比如 anchor 的生成和 NMS 操作。这大大简化了物体检测的设计流程。基本的结构还是沿用了以…

低代码产品表单渲染架构

在React和Vue没有流行起来的时候,低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子: 产品层 用户通过打开表单,使用不同业务场景业务下的表单页面,中间的Render层就是技术实现。 每一个不同业务的表单…

XSS 漏洞全面解析:原理、危害与防范

目录 前言​编辑 漏洞原理 XSS 漏洞的危害 检测 XSS 漏洞的方法 防范 XSS 漏洞的措施 前言 在网络安全的复杂版图中,XSS 漏洞,即跨站脚本攻击(Cross - Site Scripting),是一类极为普遍且威胁巨大的安全隐患。随着互…

拒绝 Github 投毒,通过 Sharp4SuoBrowser 分析 Visual Studio 隐藏文件

近期的网络安全事件中,某提权工具被发现植入后门,攻击者使用 .suo 文件作为隐蔽攻击媒介。由于 .suo 文件是项目的隐藏配置文件,安全研究人员很少关注它的内容。 此次攻击事件被初步判断为东南亚地区的 APT 组织——海莲花(Lotus…

shiro学习五:使用springboot整合shiro。在前面学习四的基础上,增加shiro的缓存机制,源码讲解:认证缓存、授权缓存。

文章目录 前言1. 直接上代码最后在讲解1.1 新增的pom依赖1.2 RedisCache.java1.3 RedisCacheManager.java1.4 jwt的三个类1.5 ShiroConfig.java新增Bean 2. 源码讲解。2.1 shiro 缓存的代码流程。2.2 缓存流程2.2.1 认证和授权简述2.2.2 AuthenticatingRealm.getAuthentication…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者:本人是一名县级融媒体中心的工程师,多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展,文字转语音(Te…

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时&…

HarmonyOS应用开发快速入门

本节内容将帮助开发者学习如何构建一个全新的HarmonyOS应用,学习使用DevEco Studio创建新项目、使用预览器预览页面、了解基础组件如Image、Text等。 文章目录 一、介绍二、创建一个新项目三、页面结构总览四、自定义文本视图五、创建Image组件 一、介绍 根据本教程…

高级编码参数

1.跳帧机制 参考资料:frameskipping-hotedgevideo 跳帧机制用于优化视频质量和编码效率。它通过选择性地跳过某些帧并使用参考帧来预测和重建视频内容,从而减少编码所需的比特率,同时保持较高的视频质量。在视频编码过程中,如果…

CUDA学习-内存访问

一 访存合并 1.1 说明 本部分内容主要参考: 搞懂 CUDA Shared Memory 上的 bank conflicts 和向量化指令(LDS.128 / float4)的访存特点 - 知乎 1.2 share memory结构 图1.1 share memory结构 放在 shared memory 中的数据是以 4 bytes(即 32 bits)作为 1 个 word,依…

「AI学习笔记」深度学习进化史:从神经网络到“黑箱技术”(三)

在这篇文章中,我们将探讨深度学习(DL)这一领域的最新发展,以及它如何从传统机器学习(ML)中独立出来,成为一个独立的生态系统。深度学习的核心思想与我们大脑中的神经网络高度相似,因…

On to OpenGL and 3D computer graphics

2. On to OpenGL and 3D computer graphics 声明:该代码来自:Computer Graphics Through OpenGL From Theory to Experiments,仅用作学习参考 2.1 First Program Square.cpp完整代码 /// // square.cpp // // OpenGL program to draw a squ…

蓝桥杯练习日常|递归-进制转换

蓝桥云课760数的计算 一、递归 题目&#xff1a; 我的解题代码&#xff1a; #include <iostream> using namespace std; int sum0; int main() {// 请在此输入您的代码int n;cin>>n;int fun(int n);fun(n); cout<<sum<<\n;return 0; } // void fu…

WordPress使用(1)

1. 概述 WordPress是一个开源博客框架&#xff0c;配合不同主题&#xff0c;可以有多种展现方式&#xff0c;博客、企业官网、CMS系统等&#xff0c;都可以很好的实现。 官网&#xff1a;博客工具、发布平台和内容管理系统 – WordPress.org China 简体中文&#xff0c;这里可…

镭速大文件传输自动选择压缩算法原理

目前&#xff0c;在文件传输系统里&#xff0c;大家通常会在数据传输之前先把数据压缩一下&#xff0c;这样传输起来更方便。不过&#xff0c;现在的情况是&#xff0c;不同平台都用同一种压缩算法&#xff0c;但其实不同的压缩算法在不同平台上表现差别挺大的。如果不在意平台…

JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【玩转全栈】----Django基本配置和介绍

目录 Django基本介绍&#xff1a; Django基本配置&#xff1a; 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍&#xff1a; Django是一个开源的、基于Python的高级Web框架&#xff0c;旨在以快速、简洁的方式构建高质量的Web…

机器学习周报-文献阅读

文章目录 摘要Abstract 1 相关知识1.1 WDN建模1.2 掩码操作&#xff08;Masking Operation&#xff09; 2 论文内容2.1 WDN信息的数据处理2.2 使用所收集的数据构造模型2.2.1 Gated graph neural network2.2.2 Masking operation2.2.3 Training loss2.2.4 Evaluation metrics 2…

Visual Studio Code修改terminal字体

个人博客地址&#xff1a;Visual Studio Code修改terminal字体 | 一张假钞的真实世界 默认打开中断后字体显示如下&#xff1a; 打开设置&#xff0c;搜索配置项terminal.integrated.fontFamily&#xff0c;修改配置为monospace。修改后效果如下&#xff1a;