news 2026/4/28 5:20:31

C/C++中线程基本概念与创建详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C/C++中线程基本概念与创建详解

一、线程基本概念

线程是在进程中产生的一个执行单元,是CPU调度和分配的最小单元,其在同一个进程中与其他线程并行运行,他们可以共享进程内的资源,比如内存、地址空间、打开的文件等等。

线程是CPU调度和分派的基本单位,

进程是分配资源的基本单位

进程:正在运行的程序

是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称,从操作系统核心角度来说,进程是操作系统调度除CPU时间片外进行的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像(如与进程关联的程序与数据),并以进程为单位对各种资源实施保护,如受保护地访问处理器、文件、外部设备及其他进程(进程间通信)

计算机有很多资源组成,比如CPU、内存、磁盘、鼠标、键盘等,就像一个工厂由电力系统、作业车间、仓库、管理办公室和工人组成

假定工厂的电力有限,一次只能供给一个或少量几个车间使用。也就是说,一部分车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务,多个CPU能够运行少量任务。

线程就好比车间里的工人。一个进程可以包括多个线程,他们协同完成某一个任务。

二、为什么使用多线程

1.避免阻塞

大家知道,单个进程只有一个主线程,当主线程阻塞的时候,整个进程也就阻塞了,无法再去做其它的一些功能了。

2.避免CPU空转

应用程序经常会涉及到RPC,数据库访问,磁盘IO等操作,这些操作的速度比CPU慢很多,而在等待这些响应时,CPU却不能去处理新的请求,导致这种单线程的应用程序性能很差。

3.提升效率

一个进程要独立拥有4GB的虚拟地址空间,而多个线程可以共享同一地址空间,线程的切换比进程的切换要快得多。

上下文切换

三、创建线程函数

1.CreateThread

CreateThread是一种微软在Windows API中提供了建立新的线程的函数,该函数在主线程的基础上创建一个新线程。线程终止运行后,线程对象仍然在系统中,必须通过CloseHandle函数来关闭该线程对象。

1

2

3

4

5

6

7

8

HANDLECreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD

SIZE_TdwStackSize,//initialstacksize

LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction

LPVOIDlpParameter,//threadargument

DWORDdwCreationFlags,//creationoption

LPDWORDlpThreadId//threadidentifier

)

第一个参数 lpThreadAttributes 表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。

第二个参数 dwStackSize 表示线程栈空间大小。传入0表示使用默认大小(1MB)。

第三个参数 lpStartAddress 表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。

第四个参数 lpParameter 是传给线程函数的参数。

第五个参数 dwCreationFlags 指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。

第六个参数 lpThreadId 将返回线程的ID号,传入NULL表示不需要返回该线程ID号

2._beginthreadex

1

2

3

4

5

6

7

8

9

unsignedlong_beginthreadex(

void*security,// 安全属性, 为NULL时表示默认安全性

unsigned stack_size,// 线程的堆栈大小, 一般默认为0

unsigned(_stdcall *start_address)(void*),// 线程函数

void*argilist,// 线程函数的参数

unsigned initflag,// 新线程的初始状态,0表示立即执行,//CREATE_SUSPENDED表示创建之后挂起

unsigned *threaddr// 用来接收线程ID

);

返回值 : // 成功返回新线程句柄, 失败返回0

__stdcall表示

1.参数从右向左压入堆栈2.函数被调用者修改堆栈

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 5:17:21

F-RAM技术原理、优势与应用场景解析

1. F-RAM技术原理与核心特性解析铁电随机存取存储器(Ferroelectric Random Access Memory,简称F-RAM)是一种基于铁电材料极化特性的非易失性存储技术。与传统存储器相比,F-RAM在物理结构和工作原理上有着本质区别。1.1 铁电效应与…

作者头像 李华
网站建设 2026/4/28 5:16:23

1.6 基因会说话——开会时大家在讨论什么,

前面几节我们讲了“培养人”的四个天花板,也算了“系统模式”和“人模式”在规模效应上的差距。这些差距,不是一夜之间形成的。它从一开始就藏在公司的基因里。那怎么看一家公司的基因?我的方法很简单:去听他们开会。两种会议&…

作者头像 李华
网站建设 2026/4/28 5:13:30

字典(Dict)精髓:结构化数据与大模型参数配置

字典(Dict)精髓:结构化数据与大模型参数配置 昨天调试大模型推理服务时,又遇到了那个经典问题——配置文件嵌套太深,某个参数路径写错,导致整个batch推理结果异常。凌晨三点盯着日志,突然意识到:这不就是字典没玩明白的代价吗?Python字典远不止是键值对容器,它是结构…

作者头像 李华
网站建设 2026/4/28 5:10:21

Arm Cortex-X925 PMU架构解析与性能监控实战

1. Arm Cortex-X925 PMU架构深度解析性能监控单元(Performance Monitoring Unit, PMU)是现代处理器微架构设计中不可或缺的组成部分。作为硬件性能分析的神经中枢,Cortex-X925的PMU模块通过31个可编程事件计数器和1个专用周期计数器,实现了从指令流水线到…

作者头像 李华