pthread_create函数是POSIX线程(也称为pthreads)库中创建新线程的核心函数。它在Linux和其他类UNIX操作系统中被广泛使用。当你调用pthread_create时,系统会执行以下主要步骤:
-
线程标识符分配:系统为新线程分配一个唯一的线程ID。这个ID在后续的线程管理操作中被用来标识这个线程。
-
线程属性设置:线程的属性(如堆栈大小、调度策略等)根据传入pthread_create的pthread_attr_t参数进行配置。如果该参数为NULL,将使用默认的线程属性。
-
堆栈空间分配:为新线程分配堆栈空间。堆栈大小可以通过线程属性指定,或使用系统默认值。
-
初始化寄存器和线程上下文:设置新线程的程序计数器(PC)、堆栈指针(SP)等寄存器,并初始化新线程的执行上下文以准备运行。
-
启动例程设置:将传给pthread_create的函数指针作为新线程的启动例程(即新线程将从此函数开始执行)。同时,将相应的参数传递给这个启动例程。
-
线程状态设置:将新线程的状态设置为可运行(RUNNABLE),并插入到系统的调度器中,等待CPU时间片以便执行。
-
返回控制权:pthread_create函数返回到调用者线程,创建过程完成。如果成功,返回0;否则返回一个错误码。
调用上述函数后,调用线程和新线程的时序如下:
调用线程
|
| pthread_create()
V
(1) 分配线程ID
(2) 配置线程属性
(3) 分配堆栈空间
(4) 初始化线程上下文
(5) 设置启动例程和参数
(6) 线程状态设置为可运行
|
| 返回
V
继续执行...
新线程
| 等待调度...
V
(6) 获得CPU时间片
|
| 运行启动例程
V
执行...
需要注意的是,在多核处理器上,新创建的线程可能立即在另一个核心上开始执行,而调用pthread_create的线程继续在原来的核心上执行。这意味着,两个线程的执行是并发进行的。退出线程时(通过返回从启动例程或调用pthread_exit)会释放线程的执行上下文和部分资源,但线程的标识符和某些资源会保持不变,直到调用pthread_join或采取类似措施以回收这些资源。