多线程函数

一、线程创建与终止函数

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 链接选项。
相关推荐
Hello.Reader1 小时前
算法基础(九)——循环不变式如何证明一个算法是正确的
java·开发语言·算法
寻道模式1 小时前
【开发心得】给私有部署OpenClaw添加PDF阅读技能
开发语言·python·pdf
逐梦苍穹1 小时前
Claude Code调用Codex失败复盘:从10个Agent、0次codex exec到Bash-only Worker + Hook强制委托
开发语言·chrome·bash
赏金术士1 小时前
Kotlin 从入门到进阶 之泛型 模块(七)
android·开发语言·kotlin
代码中介商1 小时前
C++ 异常处理完全指南
开发语言·c++
MATLAB代码顾问1 小时前
粒子群优化算法(PSO)原理与Python高级实现
开发语言·python·算法
yhy66666662 小时前
java内存
java·开发语言
码云社区2 小时前
JAVA同城上门做饭系统家政上门同城服务系统源码小程序+APP+公众号+h5
java·开发语言·小程序
小灰灰搞电子2 小时前
PyQt QtWaitingSpinner详解-为你的 Qt 程序带来丝滑等待动画
开发语言·qt·pyqt