news 2026/9/15 2:05:52

Linux 线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 线程

一、线程核心概念

1. 定义与归属

  • 线程是轻量级进程(Lightweight Process, LWP),必须隶属于某个进程,不能独立存在。
  • 进程是线程的 "容器",线程的所有操作都依赖于进程的资源(如代码段、数据段、文件描述符等)。

2. 核心作用

与进程一致,线程的核心作用是实现并发执行,尤其适合处理:

  • 相对耗时的任务(如网络 IO、文件读写)
  • 需要并行处理的逻辑(如多任务拆分)

二、线程与进程的核心区别

对比维度进程线程
资源分配单位系统最小资源分配单位系统最小执行单位
资源独立性资源完全独立(地址空间、文件描述符等)共享进程资源,仅私有栈区
稳定性稳定性高(一个进程崩溃不影响其他)稳定性低(一个线程崩溃导致整个进程崩溃)
创建开销大(需分配 3GB 独立地址空间)小(仅需开辟 8MB 栈区)
并发度高(资源共享,切换成本低)
内部关系进程间是独立关系同一进程内线程是平级关系

关键补充:

  • 同一进程中,默认存在 1 个主线程(程序启动时创建,执行 main 函数),其他线程为子线程。
  • 线程的私有资源仅为栈区(用于存储局部变量、函数调用栈),其余资源(代码段、数据段、堆区、文件描述符)均与进程内其他线程共享。

三、POSIX 线程编程核心步骤

  1. 创建多线程:通过 API 创建子线程,指定线程执行逻辑。
  2. 线程空间操作:子线程执行指定任务(共享进程资源,私有栈区操作)。
  3. 线程资源回收:线程退出后,默认栈区不释放,需主动回收(或设置分离属性自动回收)。

四、线程相关工具命令

1. 查看线程信息

bash

运行

# 显示所有线程的PID、PPID、LWP(线程ID)、状态、命令 ps -eLo pid,ppid,lwp,stat,comm # 显示所有线程的详细信息(包括CPU占用、内存等) ps -eLf
  • lwp:线程 ID(与pthread_self()获取的 ID 一致)
  • stat:线程状态(如 R 运行、S 睡眠、Z 僵尸)

2. 工作路径相关函数(辅助线程文件操作)

(1)获取当前工作路径

c

运行

#include <unistd.h> char *getcwd(char *buf, size_t size);
  • 功能:获取当前进程(线程共享)的工作路径。
  • 参数:
    • buf:存储路径的字符数组(需提前分配空间)。
    • sizebuf的最大长度(避免缓冲区溢出)。
  • 返回值:
    • 成功:返回指向buf的指针(路径字符串)。
    • 失败:返回NULL(错误原因通过errno查看)。
(2)切换工作路径

c

运行

#include <unistd.h> int chdir(const char *path);
  • 功能:修改当前进程(线程共享)的工作路径。
  • 参数:path:目标路径(绝对路径或相对路径)。
  • 返回值:
    • 成功:返回0
    • 失败:返回-1(错误原因通过errno查看)。

五、POSIX 线程核心 API 函数

所有线程函数均在<pthread.h>头文件中声明,编译时需链接线程库(添加-lpthread参数)。

1. 创建线程:pthread_create

c

运行

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
  • 功能:创建一个新的子线程。
  • 参数:
    • thread:输出参数,存储新创建线程的 ID(需提前定义pthread_t变量)。
    • attr:线程属性(一般设为NULL,使用默认属性)。
    • start_routine:线程执行函数(函数指针),即线程的入口逻辑(回调函数),格式要求:

      c

      运行

      void *func(void *arg) { /* 线程逻辑 */ }
    • arg:传递给start_routine的参数(无参数时设为NULL)。
  • 返回值:
    • 成功:返回0
    • 失败:返回非 0 错误码(需通过strerror()转换为错误信息)。

2. 获取当前线程 ID:pthread_self

c

运行

pthread_t pthread_self(void);
  • 功能:获取调用该函数的线程的 ID。
  • 参数:无。
  • 返回值:当前线程的 ID(类型为pthread_t,打印时用%lu格式符)。

3. 线程退出:pthread_exit

c

运行

void pthread_exit(void *retval);
  • 功能:子线程主动退出(不会影响其他线程和进程)。
  • 参数:retval:线程退出状态("临死遗言"),可通过pthread_join回收。
  • 返回值:无(线程退出后不再执行后续代码)。

4. 取消线程:pthread_cancel

c

运行

int pthread_cancel(pthread_t thread);
  • 功能:请求终止指定 ID 的线程(仅为 "请求",线程需响应才能退出)。
  • 参数:thread:目标线程的 ID。
  • 返回值:
    • 成功:返回0(仅表示请求发送成功,不代表线程已退出)。
    • 失败:返回非 0 错误码。

5. 阻塞回收线程资源:pthread_join

c

运行

int pthread_join(pthread_t thread, void **retval);
  • 功能:阻塞等待指定线程退出,并回收其资源(栈区),避免内存泄漏。
  • 参数:
    • thread:要回收的子线程 ID。
    • retval:输出参数,存储子线程的退出状态(即pthread_exitretval)。
  • 返回值:
    • 成功:返回0
    • 失败:返回非 0 错误码。

6. 设置线程分离属性:pthread_detach

c

运行

int pthread_detach(pthread_t thread);
  • 功能:设置线程为 "分离属性",线程退出后系统自动回收其资源(无需pthread_join)。
  • 适用场景:不需要获取线程退出状态,仅需线程执行完自动释放资源。
  • 参数:thread:目标线程的 ID(通常设为pthread_self(),即线程自分离)。
  • 返回值:
    • 成功:返回0
    • 失败:返回非 0 错误码。

六、关键注意事项

  1. 编译链接:使用 POSIX 线程函数时,编译命令需添加-lpthread(链接线程库),例如:

    bash

    运行

    gcc thread_demo.c -o thread_demo -lpthread
  2. 资源共享与竞争:线程共享进程资源(如全局变量、文件描述符),多线程操作共享资源时需加锁(如pthread_mutex_t),避免数据竞争。
  3. 线程退出与回收
    • 未设置分离属性的线程,退出后必须通过pthread_join回收,否则会成为 "僵尸线程",占用系统资源。
    • 主线程退出时,若未处理子线程,会导致所有子线程被强制终止(可通过pthread_join让主线程等待子线程)。
  4. 线程安全:局部变量存储在栈区(线程私有),全局变量、堆区数据(线程共享)需保证线程安全(加锁、原子操作等)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 0:58:19

如何快速实现Unity游戏多语言支持:新手完整指南

在Unity游戏开发与本地化过程中&#xff0c;语言障碍常常成为玩家体验的主要障碍。XUnity.AutoTranslator作为一款专为Unity游戏打造的高效自动翻译工具&#xff0c;提供了完整的本地化解决方案&#xff0c;让游戏语言转换变得简单快捷。本文将带你从零开始&#xff0c;快速掌握…

作者头像 李华
网站建设 2026/9/14 14:42:02

[漫画]《软件方法》逃避思考的伪创新舒适区

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 我把《软件方法》第1章的内容交给Nano Banana Pro&#xff0c;让它生成漫画。AI生成的漫画如下&#xff1a; 原文如下&#xff1a; 1.2.1 建模工作流ABCD 要做好需求和设计&#xff…

作者头像 李华
网站建设 2026/9/13 23:22:56

[漫画]喜欢自编图形的遮羞布

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 我把《软件方法》第1章的内容交给Nano Banana Pro&#xff0c;让它生成漫画。AI生成的漫画如下&#xff1a; 原文如下&#xff1a; 1.3.2.3 自编图形 vs. 标准图形 事实上&#xff0…

作者头像 李华
网站建设 2026/9/15 1:40:34

LobeChat能否支持星际语言翻译?外星文明假说沟通模型构建

LobeChat与未知语言的对话&#xff1a;当开源框架遇见星际沟通假想 设想这样一个场景&#xff1a;深空探测器接收到了一段来自半人马座α星方向的复杂信号&#xff0c;其结构既非随机噪声&#xff0c;也不符合任何已知自然规律。科学家们将其转录为可分析的数据流——这或许不是…

作者头像 李华
网站建设 2026/9/14 0:21:30

软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(16)

接前一篇文章:软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(15) 所属章节: 第15章. 面向服务架构设计理论与实践 第8节 SOA的设计模式 15.8 SOA的设计模式 15.8.1 服务注册表模式 服务注册表(Service Registry)主要在SOA设计时段使用,虽然它们常常也具…

作者头像 李华
网站建设 2026/9/14 4:07:59

J2EE技术及应用实验及报告(黑龙江大学)

一、实验代码百度网盘链接: https://pan.baidu.com/s/1RhiVh6T6eXSJpHvSPcRycw?pwd9999 提取码: 9999二、实验报告 实验一一、实验名称实验1 WEB基础二、实验目的熟悉运行环境的安装和使用&#xff1b;了解和掌握基本的HTML标签和JavaScript语法。三、实验类型验证型四、实验…

作者头像 李华