线程创建流程
在Linux系统中,创建一个线程通常指的是调用POSIX线程库的 pthread_create() 函数。
1. 用户态发起:调用 pthread_create()
这是所有多线程程序的起点。你的程序需要包含 <pthread.h> 头文件,并调用 pthread_create() 函数。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
这个函数主要做两件事:
- 准备参数:指定新线程要执行的函数 (
start_routine) 及其参数 (arg),并设置线程属性 (attr)。 - 进入内核:封装好这些信息后,它会在内部触发一个关键的系统调用,请求操作系统内核创建新的执行实体。
2. 用户态与内核态的桥梁:系统调用 clone()
这是整个流程中最核心的一步。pthread_create() 的底层实现会调用Linux特有的系统调用 clone()。
clone()与传统创建进程的fork()不同,它允许新创建的任务共享调用者的内存空间、文件描述符表、信号处理函数等资源。- 通过巧妙地设置
clone()的标志位(flags),Linux 实现了"线程"的概念:一个轻量级的、能与父任务共享绝大部分资源的进程。
3. 内核态执行:创建并初始化内核级线程实体
在内核中,clone() 系统调用会执行以下操作:
- 创建内核数据结构:内核为新线程创建一个新的
task_struct(进程/线程描述符)。在Linux内核视角中,线程和进程并无本质区别,都是可调度的任务。 - 共享资源:新线程的
task_struct会通过指针指向创建者的内存地址空间、文件表等资源,实现高效的数据共享。 - 分配内核堆栈:为新的线程分配独立的内核栈,用于在内核态执行时保存函数调用和局部变量。
- 设定调度实体:将新线程设置为可运行状态,等待操作系统的调度器选择它来获得CPU时间。此时,线程已经有了一个内核级别的唯一ID,即轻量级进程ID (LWP, Light-Weight Process ID)。
4. 返回用户态:新线程开始运行
- 当调度器选中新线程执行时,CPU会从内核态切换回用户态。
- 新线程会从
pthread_create()时指定的start_routine函数开始执行,其参数arg也会被正确地传递过去。 - 同时,
pthread_create()调用成功返回0,并将新线程的ID写入第一个参数thread指向的内存中,供主线程后续操作(如pthread_join)使用。
总的来说,Linux创建线程的本质,就是通过 clone() 系统调用,创建一个能够与原有进程共享大部分资源的、独立的内核调度实体。这种"轻量级进程"的实现方式,使得线程的创建速度和切换开销都远小于传统进程。

浙公网安备 33010602011771号