一、基本概念

1. 进程 vs 线程

项目 进程 线程
定义 系统中最小的资源分配单位(CPU + 内存) 进程内的轻量级任务,是系统中最小的执行单位
关系 独立 从属于某个进程,一个进程可有多个线程
内存 用户空间内存私有 共享进程的代码段、数据段、堆;栈区私有(默认约 8MB)
开销 创建开销大(需分配 0~3GB 虚拟地址空间) 创建开销小(只需分配栈空间)
适用场景 需要大量资源的复杂任务 轻量级并发任务

✅ 共同点:都支持并发执行


二、线程编程步骤

  1. 创建线程
  2. 在线程函数中执行任务
  3. 回收线程资源(避免僵尸线程)

三、常用命令(查看线程)

ps -eLf          # 查看所有线程(LWP 列为线程 ID)
ps -eLo pid,ppid,lwp,stat,comm  # 自定义列:LWP 即线程 ID

 LWP(Light Weight Process)= 线程在内核中的 ID


四、核心 pthread 函数

1. pthread_create —— 创建线程

#include <pthread.h>

int pthread_create
(
    pthread_t *thread,                // 输出:新线程的 ID(需预先定义)
    const pthread_attr_t *attr,       // 线程属性(通常设为 NULL,表示默认)
    void *(*start_routine)(void *)   //线程执行函数(函数指针,即“回调函数”)
    void *arg                         // 传递给 start_routine 的参数
);

  • 返回值:成功返回 0,失败返回错误码
  • 注意start_routine 是函数名(即函数地址)

2. pthread_self —— 获取当前线程 ID

pthread_t pthread_self(void);
  • 返回值:当前线程的 ID(类型 pthread_t,通常等价于 unsigned long

3. pthread_exit —— 主动退出当前线程

void pthread_exit(void *retval);
  • 参数retval 是返回给 pthread_join 的数据指针
  • 注意:确保 retval 指向的数据在线程结束后仍可访问(如全局变量或堆内存)

4. pthread_cancel —— 请求取消指定线程

int pthread_cancel(pthread_t thread);
  • 参数:目标线程的 ID
  • 返回值:成功返回 0,失败返回错误码
  • 注意:线程需运行到“取消点”(如 sleep, printf)才会真正退出

五、补充说明

  • 栈大小:默认约 8MB,可通过 pthread_attr_t 修改
  • 线程 ID 类型pthread_t 通常是 unsigned long,但不保证跨平台一致
  • 编译链接:必须加 -lpthread
    gcc program.c -lpthread
    

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐