线程基础概念

1、线程概念:

    线程是一个轻量级的进程     
    每一个线程都属于一个进程
    
    
    进程是操作系统资源分配的最小单元
    线程是CPU任务调度的最小单元
    
    线程是一个任务执行的过程,包括创建、调度、消亡
    创建:
        线程空间位于进程空间内部

        进程:
            1.文本段
            2.数据段
            3.堆区

    进程中的每个线程,栈区是独立的,共享进程中的数据区和文本区,堆区。

    调度:
        宏观并行、微观串行
        
        与进程调度保持一致

    线程消亡:
        线程执行结束后,需要回收线程空间

2、多进程和多线程的优缺点:

1.执行效率:

        多线程执行效率高(并发程度(创建速度快)和任务切换(在一个进程空间内部完成多线程任务切换))
        多进程执行效率低

2.通信角度:

        线程可以共享空间,可以直接通信(多线程间可以使用全局变量通信,因为全局变量为共享空间)
        进程空间独立,不能直接通信(通信必须使用:管道、信号、消息队列、共享内存、信号灯等方式)

3.安全性:

        多进程安全(一个进程异常结束不影响其余进程执行)
        多线程不安全(一个线程异常结束会导致进程结束,其余线程均无法继续执行)

4.内存消耗:

        进程消耗系统资源高于线程

3、线程的设计框架

线程实现接口:
    系统调用             pthread线程库
    fork                        pthread_create 
    exit                         pthread_exit 
    wait                        pthread_join 
    getpid()                  pthread_self()

1.pthread_create

  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
        失败返回非0值


2、pthread_t pthread_self(void); 

   功能:获取当前线程的线程id
   参数:无
   返回值:成功 返回当前线程的线程id
               失败  -1;

示例:四线程的进程运行程序

4.线程的退出:

  1: 自行退出 ==》自杀  ==》子线程自己退出
        
        return NULL;
        
        void pthread_exit(void *retval);
        功能:子线程自行退出
        参数: retval 线程退出时候的返回状态,临死遗言。(不能是局部变量的地址)
        返回值:无

    
    2: 强制退出 ==》他杀  ==》被其他线程结束
        int pthread_cancel(pthread_t thread);
        功能:请求结束一个线程
        参数:thread 请求结束一个线程tid
        返回值:成功 0
                失败 -1;
        
        线程间可以指定被取消。

    3:  int pthread_join(pthread_t thread, void **retval);    
          功能:通过该函数可以将指定的线程资源回收,该函数具有
                阻塞等待功能,如果指定的线程没有结束,则回收线程
                会阻塞。
          参数:thread  要回收的子线程tid
                retval  要回收的子线程返回值/状态。==》ptread_exit(值);
          返回值:成功 0
                  失败 -1;

5.线程的回收

       线程的结束机制 ====》不同与进程没有孤儿线程和僵尸线程。
                  ====》主进程结束任意生成的次线程都会结束。(因为共享的进程空间被回收了)。
                  ====》次线程的正常结束不会影响主线程的运行。
                  
      子线程的回收策略:
      1、如果预估子线程可以有限范围内结束则正常用pthread_join等待回收。
      2、如果预估子线程可能休眠或者阻塞则等待一定时间后强制回收。
      3、如果子线程已知必须长时间运行则,不再回收其资源。

今天,我们利用进程和线程制作一个数据接收和存储小程序

我们通过不同的线程,分别实现接收数据,终端打印,文件存储。 

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

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

相关文章

“生日悖论”简析——公式计算、代码模拟

“生日悖论”共享生日概率,通项公式计算,代码模拟计算。 (笔记模板由python脚本于2024年07月17日 18:16:40创建,本篇笔记适合会基础编程的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&…

《汇编语言 基于x86处理器》- 读书笔记 - Visual Studio 2019 配置 MASM环境

安装 Visual Studio 2019 配置 MASM环境 下载 Visual Studio Installer安装 Visual Studio 20191. 双击运行2. 自定义安装内容3. 修改 MSVC 工具集版本4. 设置主题(可选)5. 安装代码高亮插件 AsmDude(可选)6. 通义灵码&#xff08…

C++基础语法:STL之容器(4)--序列容器中的list(一)

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 序列容器的学习.以<C Prime Plus> 6th Edition(以下称"本书")内容理解 本书中容器内容不多只有几页.最好是有数据结构方面的知识积累,如果没有在学的同时补上. 序列容器回顾:序列容器内元素按严格…

多口适配器,给您的生活增添便利

随着科技的快速发展&#xff0c;我们的生活已离不开各种各样的电子设备&#xff0c;智能手机、平板电脑、智能手表、无线耳机……它们共同构建了我们丰富多彩的数字生活。然而&#xff0c;面对众多设备的充电需求&#xff0c;传统的单一充电口已难以满足现代人的使用习惯。在这…

x264 编码器 CAVLC 熵编码源码分析

CAVLC 关于 CAVLC 原理具体可参考:基于上下文自适应可变长熵编码 CAVLC 原理详细分析函数关系图 x264_macroblock_write_cavlc函数 函数作用:用于将宏块(macroblock)的数据通过 CAVLC(Context-based Adaptive Variable Length Coding)编码成比特流。函数内部核心功能:宏…

使用 OpenCV 和 YOLO 模型进行实时目标检测并在视频流中显示检测结果

文章目录 Github官网简介视频帧推理视频设备ID安装依赖 检测示例分类示例姿势估计 Github https://github.com/ultralytics/ultralytics 官网 https://docs.ultralytics.com/zhhttps://docs.ultralytics.com/zh/quickstart/ 简介 Ultralytics 是一个软件公司&#xff0c;专…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

Linux下如何安装配置Graylog日志管理工具

Graylog是一个开源的日志管理工具&#xff0c;可以帮助我们收集、存储和分析大量的日志数据。它提供了强大的搜索、过滤和可视化功能&#xff0c;可以帮助我们轻松地监控系统和应用程序的运行情况。 在Linux系统下安装和配置Graylog主要包括以下几个步骤&#xff1a; 准备安装…

【Spark On Hive】—— 基于电商数据分析的项目实战

文章目录 Spark On Hive 详解一、项目配置1. 创建工程2. 配置文件3. 工程目录 二、代码实现2.1 Class SparkFactory2.2 Object SparkFactory Spark On Hive 详解 本文基于Spark重构基于Hive的电商数据分析的项目需求&#xff0c;在重构的同时对Spark On Hive的全流程进行详细的…

【人工智能】机器学习 -- 决策树(乳腺肿瘤数)

目录 一、使用Python开发工具&#xff0c;运行对iris数据进行分类的例子程序dtree.py&#xff0c;熟悉sklearn机器实习开源库。 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库&#xff0c;使用决策树对breast-cancer-wisconsin.data进行分类。 …

Linux 注意事项

Linux 与 Windows 是两个相互独立的操作系统&#xff0c;两者有较大差距&#xff1a; 1.1 Linux 严格区分大小写&#xff08;Windows不严格区分大小写&#xff09;&#xff1b; 1.2 Linux 中所有内容&#xff0c;硬件设备都以文件形式保存在 /dev 目录下&#xff08;万物皆文件…

攻防世界 re新手模式

Reversing-x64Elf-100 64位ida打开 看if语句&#xff0c;根据i的不同&#xff0c;选择不同的数组&#xff0c;后面的2*i/3选择数组中的某一个元素&#xff0c;我们输入的是a1 直接逆向得到就行 二维字符数组写法&#xff1a;前一个是代表有几个字符串&#xff0c;后一个是每…

Logback日志异步打印接入指南,输出自定义业务数据

背景 随着应用的请求量上升&#xff0c;日志输出量也会成线性比例的上升&#xff0c;给磁盘IO带来压力与性能瓶颈。应用也遇到了线程池满&#xff0c;是因为大量线程卡在输出日志。为了缓解日志同步打印&#xff0c;会采取异步打印日志。这样会引起日志中的追踪id丢失&#xf…

鸿蒙OS开发工具 DevEco Studio(4.0)安装教程

1.旧版本下载地址【HarmonyOS】HUAWEI DevEco Studio 下载地址汇总_deveco studio历史版本-CSDN博客 2.解压安装包&#xff0c;双击安装程序 3.打开后点击Next 4.点击“Browse...”选择路径&#xff0c;然后点击“Next” 5.勾选&#xff0c;点击“Next” 6.默认&#xff0c;直…

NASA数据集——宝瓶座天体微波发射图辅助数据集 V1.0

Aquarius Celestial Sky Microwave Emission Map Ancillary Dataset V1.0 宝瓶座天体微波发射图辅助数据集 V1.0 简介 本数据集包含三张 L 波段&#xff08;波长 21 厘米&#xff09;天体&#xff08;"银河系"&#xff09;亮度温度图&#xff0c;用于处理美国航天…

maven 私服搭建(tar+docker)

maven私服搭建 一、linux安装nexus1、工具下载 二、 docker 搭建nexus1、镜像下载创建目录2、运行nexus3、访问确认&#xff0c;修改默认密码&#xff0c;禁用匿名用户登录4、创建仓库5、创建hostd仓库6、创建Blob Stores7、创建docker私服1、创建proxy仓库2、创建hotsed本地仓…

netcat 使用

GPT-4o (OpenAI) Netcat (通常缩写为nc) 是一个功能强大的网络工具&#xff0c;可以方便地读写网络连接。它被广泛用于漏洞测试、网络调试和数据传输。Netcat 可以作为客户端&#xff0c;也可以作为服务器使用。 以下是一些常见的 Netcat 用法&#xff1a;基础用法 连接到服务…

ISP代理和双ISP代理:区别和优势

随着互联网技术的不断发展和普及&#xff0c;网络代理服务成为众多用户保护隐私、提高网络性能、增强安全性的重要工具。其中&#xff0c;ISP代理和双ISP代理是两种常见的网络代理服务形式。本文将详细探讨ISP代理和双ISP代理的区别和优势&#xff0c;以便用户更好地了解并选择…

C/C++ json库

文章目录 一、介绍1.1 json 介绍 二、C/C json 库选型2.1 选型范围2.2 jsoncpp2.2.2 jsoncpp 编译和交叉编译 2.3 rapidjson2.4 nlohmann/json2.5 sonic-cpp 五、常见问题5.1 jsoncpp 中关于浮点数的控制和中文显示问题5.2 jsoncpp序列化double类型时精度损失问题的解决办法 一…