在 Linux 系统中,线程通常使用 POSIX 线程库(pthread)进行创建和管理。创建线程的主要函数是 pthread_create
,其原型如下:
#include <pthread.h>
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg);
NULL
,则使用默认属性;若线程创建成功,函数返回 0
;否则返回错误代码。
线程属性通过 pthread_attr_t
结构体进行设置,常用的属性包括:
PTHREAD_CREATE_DETACHED
)或非分离(PTHREAD_CREATE_JOINABLE
)状态;SCHED_FIFO
、SCHED_RR
或 SCHED_OTHER
;设置属性的基本步骤包括:
pthread_attr_init
;pthread_attr_setdetachstate
;pthread_attr_destroy
。线程回收主要指对处于非分离状态(joinable)的线程进行资源回收,通过 pthread_join
函数实现:
int pthread_join(pthread_t thread, void **retval);
该函数会阻塞调用线程,直到目标线程执行完毕,并可通过 retval
获取其返回值(若有)。对于已设置为分离状态的线程,无法使用 pthread_join
,其资源在线程终止时会自动释放。
线程可以通过以下方式正常退出:
return
返回;pthread_exit
函数显式退出:void pthread_exit(void *retval);
pthread_exit
允许线程主动退出,并可传递返回值给等待回收它的线程。即使主线程调用 pthread_exit
,也不会影响其他正在运行的线程。
线程取消是一种异步终止线程的机制,通过 pthread_cancel
函数实现:
int pthread_cancel(pthread_t thread);
取消行为受以下两个设置的影响:
PTHREAD_CANCEL_ENABLE
(默认):允许取消;PTHREAD_CANCEL_DISABLE
:忽略取消请求。PTHREAD_CANCEL_DEFERRED
(默认),取消请求被挂起,直到线程执行到某个取消点(如某些阻塞型系统调用);PTHREAD_CANCEL_ASYNCHRONOUS
,线程可在任意指令点被取消。可以使用以下函数设置取消特性:
pthread_setcancelstate
:设置取消状态;pthread_setcanceltype
:设置取消类型;pthread_testcancel
:手动设置取消点。为避免资源泄漏,通常建议结合清理处理程序(pthread_cleanup_push
和 pthread_cleanup_pop
)进行资源释放。
通过上述机制,Linux 提供了强大而灵活的线程管理功能,开发者可以根据实际需求选择适当的线程控制方法,以实现高效、安全的多线程编程。