并发——线程

为了并发的执行任务(程序),现代操作系统特地引入了“进程”的概念

分析:
        1. 进程的地址空间是独立的,进程间通信的代价比较大
            如果进程需要进行数据的交换,则需要用到进程间通信(pipe / fifo / shm / msg / ...)
                         copy             copy
            p1进程 --------> 内核 --------> p2进程
        2. 创建一个进程的系统开销比较大,因为要拷贝整个父进程的地址空间("copy on write")


于是,有人就提出一个想法,能不能在同一个进程地址空间内部实现“任务(程序)”的并发执行呢?
====>线程

1. 线程的概念

1)线程是比进程更小的活动单位,它是进程中一个执行路径(执行分支),线程是依附于一个进程的
2)进程内部的所有线程共享进程的地址空间
        线程的特点:
                1. 创建一个线程比创建一个进程的开销要小得多
                    因为不要拷贝父进程的地址空间,线程不拥有系统资源,只有一点在运行中不可缺少的数据结构
                    进程是分配系统资源的最小单位

                2. 实现线程间通信十分方便,因为进程内部的所有线程共享进程的地址空间。线程之间的通信不需要调用内核
                3. 线程也是一个动态的概念(ready / running / blocking)
                    是进程内部的一个执行分支,线程是用来并发执行进程内部的指令的
                    C语言的指令必须在函数内部====>所有线程对应一个线程函数,线程的工作就是取指向指定的函数,如果指定的函数执行完了,线程也完了
                4. 一个进程里面默认有一个主线程(main函数),在进程的运行过程中,可以创建其他的子线程。主函数结束同样意味着进程结束(所有子线程都会强制退出)
                5. 进程是分配系统资源的最小单位,系统是按照线程来进行调度的(一个线程就是一个任务,需要分配CPU)

在进程内部创建多个线程,可以提高进程的CPU占有率

Thread的实现方式有很多种,比较常用的是POSIX标准的线程
线程所有的API函数都需要链接多线程库(libpthread.so)
        gcc test.c -o test -lpthread

2. linux下面线程(thread)函数的API

1)创建一个线程:pthread_create
        线程有一个线程ID(tid,thread id),类似于进程id(pid)
        用来唯一的标识一个线程的,在pthread中,使用类型 pthread_t 来描述一个线程ID
        typedef unsigned long pthread_t;
        线程属性(pthread_attr_t)
            线程的id
            线程的优先级
            线程的栈空间大小"stack"
            ....
            在pthread中,线程属性使用pthread_attr_t(结构体)来描述,同时还提供了几个用于改变线程属性的APi函数,但是不建议程序员直接修改pthread_attr_t的结构体,而是使用“线程默认属性”

线程是进程内部的一个指令的执行分支,多个线程,就是多个指令序列并发的执行。
        C语言的指令必须在函数内部,所有线程对应一个线程函数,一个线程创建成功后,要执行的指令序列全部都在一个指定的函数中“线程函数”,这个线程函数执行完毕了,线程的任务结束了。
        指定线程的执行函数???如何指定
        指定线程函数的地址,线程函数的地址作为参数传入创建线程的API,问题:
        张三的线程函数
            int func(int )
            {
            
            }
        李四的线程函数
            void *func(void)
            {
            }
            ....    
            
        线程函数的地址(函数指针)作为参数传入,函数指针也是有类型的,所以规定线程函数的地址类型必须为:
        void *(*start_routine) (void *)
        start_routine函数指针,保存一个函数的地址,指向一个函数,这个函数的类型应该是:
        void *func(void *)
        {
        
        }
        ====>
        所以线程函数都必须有一个void*的返回值,有一个void*的参数

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

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

相关文章

VHDL/CPLD硬件描述语言:2022年做的万年历实验

之前接触过一些硬件描述语言以及VHDL/CPLD的单片机的设计实验,那时是2022年了 这里补写一篇笔记,以记录一下那十多个小时 万年历实验 研究中的心得体会: 说明解释都是个人理解,与标准描述有较大出入...... 目录 输入输出器件的编写: 分频器…

HTML5 Web Workers 详解 (2)

三、高级使用 1. 多个 Web Workers 你可以在主线程中创建多个 Web Workers 来处理并行任务。例如&#xff0c;下面的代码创建了两个 Worker 并分别处理不同的任务。 主线程代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"…

8086 汇编笔记(五):包含多个段的程序

一、在代码段中使用数据 “dw”的含义是定义字型数据 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hmov bx,0mov ax,0mov cx&#xff0c;8s: add ax cs:[bx]add bx,2loop smov ax,4c00hint 21hcode…

MVC前端定义变量的艺术:深入解析与实战策略

MVC前端定义变量的艺术&#xff1a;深入解析与实战策略 在MVC&#xff08;Model-View-Controller&#xff09;架构中&#xff0c;前端定义变量是一个至关重要的环节。它涉及到数据的存储、传递和展示&#xff0c;直接影响着应用程序的性能和用户体验。本文将从四个方面、五个方…

HBase 常用 shell 操作

下面给大家介绍一些HBase 常用 shell 操作&#xff0c;各位看官看好了啦&#xff0c;我要献丑了。 进入 HBase 客户端命令操作界面 $ bin/hbase shell查看帮助命令 > help查看当前数据库中有哪些表 > list创建一张表 创建 user 表&#xff0c;包含 info、data 两个列…

【Keil 5】Keil 5下载安装激活到2032年(含MDK、C51、STM32单片机)+附带百度网盘链接

这里写目录标题 安装包、激活文件下载1.双击mdk 514开始安装2.一路点next&#xff0c;信息随便写即可3.激活4.安装STM325.激活c51 安装包、激活文件下载 解压密码&#xff1a;lantongxue 链接&#xff1a;https://pan.baidu.com/s/15Aukt0j1HCFyHBE6whuDeg?pwdsjyh 提取码&…

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…

LangChain实战技巧之四:当模型(Model)不支持Tool/Function的解决办法

文心大模型两大主力模型已全面免费&#xff0c;可参考我之前发的文章 AI菜鸟向前飞 — 今日三则AI相关新闻 但是&#xff0c;这些模型原生并不支持Tool/Function Call 如下所示&#xff1a; tool def greeting(name: str):向朋友致欢迎语return f"你好啊, {name}"…

基于LabVIEW虚拟示波器设计

随着计算机技术的发展&#xff0c;传统仪器开始向计算机化的方向发展。虚拟仪器是90年代提出的新概念。虚拟仪器技术的提出与发展&#xff0c;标志着二十一世纪自动测试与电子测量仪器领域技术发展的一个重要方向。所谓虚拟仪器&#xff0c;就是在通用的计算机平台上定义和设计…

ROS2自定义服务接口

ROS2自定义服务接口 在src/village_interface 下构建srv文件夹 src/village_interface/srv 下新建一个BorrowMoney.srv 遵循大小写编程规范 # 客户端请求 string name uint32 money # 中间这三个横杠很重要 不能删掉 --- # 服务端响应 bool success uint32 money接口编译 修改…

TDR原理的介绍

目录 简介 简单定义 TDR测试原理 简介 时域和频域就像孪生兄弟一样&#xff0c;经常在测试测量领域同时出现&#xff0c;可谓是工程师们分析问题和解决问题的两大法宝。所以&#xff0c;在某些测试场景中&#xff0c;如果有时域信息的护法&#xff0c;咱们就能从时频域两个维…

创业目标市场的选择和分析

一、市场细分与选择 创业过程中&#xff0c;选择目标市场至关重要。市场细分是将大市场分割成更小的、具有相似需求的群体。市场细分的方法主要有地理、人口、心理和行为四种&#xff1a; 地理细分&#xff1a;根据地区、城市、气候等地理因素进行市场划分。例如&#xff0c;…

【普通切换】【DC-based handover】【DAPS】协议栈分析

移动网络切换 移动通信中切换是保证终端业务的基本流程&#xff0c;而切换时延是终端(UE)不能与任何基站交互(传递)用户面数据包的最短时间。 在5G(NR)网络中当终端(UE)接收到切换命令时&#xff0c;将断开与源小区的连接向目标小区发起随机接入过程。在此期间终端(UE)的数据传…

牛客ONT45 距离是K的二叉树节点【中等 宽度优先遍历 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/e280b9b5aabd42c9b36831e522485622 思路 图&#xff0c;队列 构件图&#xff0c;直接从target出发&#xff0c;扩展到第k层就是答案Java代码 import java.util.*;/** public class TreeNode {* int val 0;* …

架构设计之安全性属性深度剖析:从理论到实践的完美融合

文章目录 引言一、安全性属性的理论探讨1.1 定义说明1.2 安全原则1.3 安全模型1.4 安全机制 二、安全性属性的实践应用2.1 安全风险评估2.2 架构设计中的安全考虑2.3 技术手段和工具2.4 团队协作与沟通2.5 安全政策和流程2.6 合规性和标准2.7 持续监控和改进 三、理论与实践的融…

Python函数进阶

文章目录 1 函数多返回值2 函数多种传参方式2.1 位置参数2.2 关键字参数2.3 缺省参数2.4 不定长参数 3 匿名函数函数作为参数传递lambda匿名函数 1 函数多返回值 def test_return():return 1,2,3 x,y,z test_return() print(x) print(y) print(z)2 函数多种传参方式 2.1 位置参…

0基础认识C语言(理论+实操3)

所有籍籍无名的日子里 我从未看轻自己半分 小伙伴们&#xff0c;一起开始我们今天的话题吧 一、算法操作符 1.双目操作符 为何叫双目操作符呢&#xff1f;其实是因为我们进行加减乘除的时候&#xff0c;至少得需要两个数字进行这些运算&#xff0c;而这个数字就被称为操作数…

基于单片机的微型嵌入式温度测量仪的设计与实现分析

摘要 &#xff1a; 作为信息技术中重要的技术手段之一嵌入式单片机系统已经被应用到越来越多不同的行业领域中。如&#xff0c;各种手持监测设备、智能家电设备等。当前展开对单片机的微型嵌入式温度测量仪的设计和实现研究&#xff0c;从微型嵌入式单片机相关理论入手&#xf…

【实战教程】构建可复用的 Spring Boot starter 微服务组件

案例 Demo&#xff1a;https://gitee.com/regexpei/coding-trainee/tree/demo/20240526_starter 介绍 在 Spring Boot 中&#xff0c;starter 启动依赖就像一个“开箱即用”的工具箱&#xff0c;它包含了第三方组件的配置和依赖&#xff0c;让我们无需手动配置和添加这些组件。…

【多目标跟踪】《FlowMOT: 3D Multi-Object Tracking by Scene Flow Association》论文阅读笔记

0.论文 论文地址链接:https://arxiv.org/pdf/2012.07541v1 通过流的方式跟踪是一个比较新颖的点,所以这里比较关注运动跟踪,是如果做到流的跟踪来预测目标的位置以及ID绑定的。 FlowMOT的框架结构如下所示,本中会主要关注下运动跟踪、数据关联、ID分配、新生/消亡…