news 2026/7/27 9:17:25

Linux:线程的概念、与进程区别及内核实现(线程一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux:线程的概念、与进程区别及内核实现(线程一)

一、什么是线程?

线程(Thread)是进程内的独立执行流,是操作系统调度的基本单位。简单理解:进程是 “资源分配的容器”,而线程是 “容器里真正干活的执行者”—— 一个进程至少包含一个主线程,多个线程共享进程的全部资源(虚拟地址空间、文件描述符、信号表等),但拥有独立的执行上下文(CPU 寄存器、栈空间)

线程的核心特点:

  1. 轻量级:创建和切换成本远低于进程(无需分配独立资源,仅需初始化执行上下文)
  2. 资源共享:同一进程内的线程共享进程的代码段、数据段、堆、文件描述符等,通信无需跨进程
  3. 独立调度:操作系统以线程为单位分配 CPU 时间片,多个线程可并发执行
  4. 协作性:线程间需通过同步机制(如互斥锁)避免共享资源竞争

二、线程与进程的核心区别(对比表)

对比维度进程(Process)线程(Thread)
资源分配单位独立分配虚拟地址空间、文件描述符等共享所属进程的所有资源
调度执行单位不直接调度,内核调度其主线程内核直接调度的基本单位
上下文切换成本高(需切换页表、地址空间等)低(仅切换 CPU 寄存器、栈)
独立性高(一个进程崩溃不影响其他进程)低(一个线程崩溃可能导致整个进程崩溃)
通信方式复杂(管道、消息队列、共享内存等)简单(共享全局变量、堆内存等)
内核实现(Linux)独立 task_struct + 独立 mm_struct独立 task_struct + 共享 mm_struct

三、Linux 中线程的内核实现:轻量级进程(LWP)

Linux 内核没有专门的线程结构体,线程的实现依赖 “轻量级进程(Lightweight Process, LWP)”—— 无论是进程还是线程,内核都用task_struct(进程控制块)描述,二者的唯一区别是是否共享mm_struct(虚拟地址空间)

  • 进程:一个task_struct对应一个独立的mm_struct(虚拟地址空间),即 “独占资源的主线程”
  • 线程:多个task_struct共享同一个mm_struct,即 “共享资源的执行流”

关键概念补充

  1. 线程组 ID(tgid):同一进程内的所有线程(包括主线程)共享同一个tgid(等于主线程的 PID),ps命令显示的 PID 本质是tgid
  2. 线程 ID(tid):每个线程的task_struct有独立的tid(内核层面的唯一标识),可通过pthread_self()gettid()获取
  3. 内核视角:Linux 内核不区分 “进程” 和 “线程”,只认task_struct,线程的 “共享资源” 特性是通过mm_struct的共享实现的

四、线程的优缺点

优点:

  1. 并发效率高:创建、切换速度快,适合需要大量并发执行的场景(如 Web 服务器处理多请求)
  2. 通信成本低:共享进程资源,无需跨进程通信的复杂机制
  3. 资源利用率高:多个线程可充分利用 CPU 多核资源,提升程序吞吐量

缺点:

  1. 缺乏独立性:线程共享进程资源,一个线程的非法操作(如野指针)可能导致整个进程崩溃
  2. 同步复杂:多个线程访问共享资源时需手动同步(如加锁),否则会出现数据错乱(竞态条件)
  3. 调试难度大:多线程的执行顺序不确定,排查死锁、竞态条件等问题比单线程复杂

五、第一个 Linux 线程程序:Hello World(含代码)

Linux 中线程编程依赖POSIX 线程库(pthread 库),需注意编译时链接-lpthread参数(否则会报未定义引用错误)

代码实现:

#include <stdio.h> #include <pthread.h> #include <unistd.h> // 线程执行函数:线程启动后会执行该函数 void* thread_func(void* arg) { // arg为传递给线程的参数(需强制类型转换) char* thread_name = (char*)arg; printf("Hello World! 我是%s,线程ID:%lu\n", thread_name, (unsigned long)pthread_self()); sleep(1); // 模拟线程执行任务 return NULL; // 线程退出,返回值为NULL } int main() { pthread_t tid; // 存储线程ID int ret; // 1. 创建线程 // 参数:线程ID指针、线程属性(NULL为默认)、线程执行函数、传递给函数的参数 ret = pthread_create(&tid, NULL, thread_func, (void*)"线程1"); if (ret != 0) { perror("pthread_create failed"); return -1; } printf("主线程ID:%lu,创建的线程ID:%lu\n", (unsigned long)pthread_self(), (unsigned long)tid); // 2. 回收线程(等待线程结束,避免线程成为僵尸线程) ret = pthread_join(tid, NULL); if (ret != 0) { perror("pthread_join failed"); return -1; } printf("线程执行完毕,主线程退出\n"); return 0; }

关键说明:

  • pthread_self():获取当前线程的 ID(用户态线程 ID,非内核 tid)
  • pthread_create():创建线程,成功返回 0,失败返回错误码(需用perrorstrerror打印错误信息)
  • pthread_join():回收线程,阻塞主线程直到目标线程结束,避免线程资源泄漏

六、总结

  • 线程是进程内的独立执行流,共享进程资源,调度成本低
  • Linux 中线程本质是轻量级进程,通过task_struct描述,共享mm_struct区分于进程
  • 入门线程编程的核心是掌握 pthread 库的基本使用,理解线程的创建与回收流程

下一篇将详细讲解线程的创建、终止、回收的完整用法,以及线程退出状态的处理,敬请关注!

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

Hunyuan-MT-7B完整指南:从部署到生产环境落地

Hunyuan-MT-7B完整指南&#xff1a;从部署到生产环境落地 1. 什么是Hunyuan-MT-7B——不是“又一个翻译模型”&#xff0c;而是能真正干活的工具 你有没有遇到过这些情况&#xff1a; 收到一封维吾尔语产品反馈&#xff0c;但团队里没人会看&#xff1b;需要把一批西班牙语电…

作者头像 李华
网站建设 2026/7/15 5:18:18

消息留存大师:让重要对话永不消失的全场景方案

消息留存大师&#xff1a;让重要对话永不消失的全场景方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitcode.com/GitHu…

作者头像 李华
网站建设 2026/7/19 0:51:53

2025革新性AI编程助手:如何用CursorCode提升300%开发效率

2025革新性AI编程助手&#xff1a;如何用CursorCode提升300%开发效率 【免费下载链接】CursorCode Cursor GPT vscode扩展插件 项目地址: https://gitcode.com/gh_mirrors/cu/CursorCode 作为开发者&#xff0c;你是否经常面临这些困境&#xff1a;重复编码占用80%工作时…

作者头像 李华
网站建设 2026/7/22 11:57:49

DamoFD人脸关键点模型效果展示:眨眼/张嘴等微表情关键点位移分析

DamoFD人脸关键点模型效果展示&#xff1a;眨眼/张嘴等微表情关键点位移分析 你有没有试过让AI“看懂”一个人正在眨眼还是张嘴&#xff1f;不是简单判断有没有人脸&#xff0c;而是精准捕捉眼皮开合的毫米级变化、嘴角上扬的细微弧度、甚至下颌微动带来的五点坐标偏移&#x…

作者头像 李华
网站建设 2026/7/26 1:38:20

如何免费解锁Cursor高级功能?Cursor自动化工具全方位使用指南

如何免费解锁Cursor高级功能&#xff1f;Cursor自动化工具全方位使用指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached y…

作者头像 李华
网站建设 2026/7/19 14:50:42

零基础掌握基因组注释:从入门到精通的效率提升指南

零基础掌握基因组注释&#xff1a;从入门到精通的效率提升指南 【免费下载链接】funannotate Eukaryotic Genome Annotation Pipeline 项目地址: https://gitcode.com/gh_mirrors/fu/funannotate 真核生物基因组分析是现代生命科学研究的重要领域&#xff0c;而功能元件…

作者头像 李华