一、线程创建与终止函数
1.1 pthread_create ------ 创建线程
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); |
| 功能 | 在调用进程中创建一个新的线程 |
参数说明
| 参数 | 说明 |
|---|---|
thread |
用于存储新创建线程的唯一标识符(线程ID) |
attr |
用于指定新线程的属性,若传 NULL 则使用系统默认属性 |
start_routine |
指向线程的入口函数(函数指针) |
arg |
用于给线程入口函数传递参数,若无需参数可设为 NULL |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0,新线程ID写入 thread 指向的变量中 |
| 失败 | 返回非0错误码 |
⚠️ 注意:编译时需链接 pthread 库,加
-lpthread参数
1.2 pthread_exit ------ 结束当前线程
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | void pthread_exit(void *retval); |
| 功能 | 结束当前线程 |
参数说明
| 参数 | 说明 |
|---|---|
retval |
用来给回收资源的线程传递线程的退出状态值 ;若不想返回退出状态值,可以传 NULL |
返回值
无返回值
二、线程标识函数
2.1 pthread_self ------ 获取当前线程ID
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | pthread_t pthread_self(void); |
| 功能 | 获取调用线程的线程ID |
| 参数 | 无 |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 总是成功,返回调用线程的线程ID |
三、线程回收函数
3.1 pthread_join ------ 等待并回收线程资源
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_join(pthread_t thread, void **retval); |
| 功能 | 阻塞等待指定的结合态线程结束,并为其回收资源 |
参数说明
| 参数 | 说明 |
|---|---|
thread |
存储要回收资源的线程ID |
retval |
用来接收线程退出的状态值,不关心可传 NULL |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
3.2 结合态 vs 分离态 ------ 资源回收管理模式
线程创建后默认处于结合态 ,若未显式设置为分离态,其终止后资源不会立即释放,必须由其他线程(通常是主线程)通过
pthread_join()主动回收。
| 对比维度 | 结合态(默认) | 分离态 |
|---|---|---|
| 资源回收方式 | 必须通过其他线程调用 pthread_join() 回收 |
线程终止后,系统自动回收资源 |
pthread_join() 作用 |
有效:调用后阻塞,直到目标线程终止并回收其资源 | 无效:调用会返回错误,无法等待分离态线程 |
| 未回收的风险 | 若主线程未调用 pthread_join(),线程终止后会成为**"僵尸线程"**,占用 task_struct 等资源 |
无风险:终止后资源立即释放,不会产生僵尸线程 |
| 状态设置时机/方式 | 创建时默认(无需额外操作);也可通过 pthread_detach() 从结合态转为分离态 |
在 pthread_create() 的 attr 参数中设置 PTHREAD_CREATE_DETACHED |
| 适用场景 | 需要获取线程退出状态的场景 | 希望自动释放资源、无需获取线程退出状态的场景 |
3.3 pthread_attr_init ------ 初始化线程属性对象
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_attr_init(pthread_attr_t *attr); |
| 功能 | 将一个线程属性对象初始化为默认值 |
参数 attr |
需要被初始化的线程属性对象 |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
3.4 pthread_attr_setdetachstate ------ 设置线程分离状态
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); |
| 功能 | 设置线程属性对象的分离状态 |
参数说明
| 参数 | 说明 |
|---|---|
attr |
设置分离状态的线程属性对象 |
detachstate |
PTHREAD_CREATE_JOINABLE :表示将线程设置为结合态 |
PTHREAD_CREATE_DETACHED :表示将线程设置为分离态 |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
3.5 pthread_attr_destroy ------ 销毁线程属性对象
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_attr_destroy(pthread_attr_t *attr); |
| 功能 | 销毁一个已初始化的线程属性对象 |
参数 attr |
指定需要被销毁的线程属性对象 |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
⚠️ 注意:
pthread_attr_init()与pthread_attr_destroy()成对使用,防止内存泄漏
四、线程控制函数
4.1 pthread_detach ------ 标记线程为分离态
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_detach(pthread_t thread); |
| 功能 | 标记一个线程为分离态(线程终止后由系统自动回收资源) |
参数 thread |
线程ID |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
4.2 pthread_cancel ------ 请求取消指定线程
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_cancel(pthread_t thread); |
| 功能 | 请求取消指定的线程;目标线程对取消请求的处理取决于其取消状态和取消类型 |
参数 thread |
要取消的线程ID |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
4.3 pthread_setcancelstate ------ 设置线程可取消状态
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_setcancelstate(int state, int *oldstate); |
| 功能 | 设置调用线程的可取消状态 |
参数说明
| 参数 | 说明 |
|---|---|
state |
PTHREAD_CANCEL_ENABLE :可被取消(默认) |
PTHREAD_CANCEL_DISABLE :不可被取消 |
|
oldstate |
存储旧的可取消状态 |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
4.4 pthread_setcanceltype ------ 设置线程可取消类型
| 项目 | 内容 |
|---|---|
| 所需头文件 | #include <pthread.h> |
| 函数原型 | int pthread_setcanceltype(int type, int *oldtype); |
| 功能 | 设置调用线程的可取消类型 |
参数说明
| 参数 | 说明 |
|---|---|
type |
PTHREAD_CANCEL_DEFERRED :延时取消(默认),直到下一次调用能作为取消点的函数时才被取消 |
PTHREAD_CANCEL_ASYNCHRONOUS :可被立即取消 |
|
oldtype |
存储旧的可取消类型值 |
返回值
| 情况 | 返回值 |
|---|---|
| 成功 | 返回 0 |
| 失败 | 返回非0错误码 |
五、函数速查汇总
| 函数 | 原型简写 | 功能 |
|---|---|---|
pthread_create |
int pthread_create(pthread_t*, const pthread_attr_t*, void*(*)(void*), void*) |
创建线程 |
pthread_exit |
void pthread_exit(void *retval) |
结束当前线程 |
pthread_self |
pthread_t pthread_self(void) |
获取当前线程ID |
pthread_join |
int pthread_join(pthread_t, void**) |
阻塞等待并回收结合态线程资源 |
pthread_attr_init |
int pthread_attr_init(pthread_attr_t*) |
初始化线程属性对象 |
pthread_attr_setdetachstate |
int pthread_attr_setdetachstate(pthread_attr_t*, int) |
设置线程分离状态 |
pthread_attr_destroy |
int pthread_attr_destroy(pthread_attr_t*) |
销毁线程属性对象 |
pthread_detach |
int pthread_detach(pthread_t) |
将线程标记为分离态 |
pthread_cancel |
int pthread_cancel(pthread_t) |
请求取消指定线程 |
pthread_setcancelstate |
int pthread_setcancelstate(int, int*) |
设置线程可取消状态 |
pthread_setcanceltype |
int pthread_setcanceltype(int, int*) |
设置线程可取消类型 |
六、综合使用示例
c
复制
编译命令:
bash
复制
gcc -o demo demo.c -lpthread
📌 小结
- 所有 pthread 函数成功返回
0,失败返回非0错误码(不是 -1)。- 结合态(默认) 需要
pthread_join()回收;分离态 系统自动回收,两者不可同时使用。pthread_cancel()只是发送取消请求 ,不会立即终止线程,目标线程需在取消点才能响应(PTHREAD_CANCEL_DEFERRED默认行为)。pthread_attr_init()与pthread_attr_destroy()必须成对使用,避免内存泄漏。- 编译 pthread 程序时必须加
-lpthread链接选项。