多线程函数

一、线程创建与终止函数

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 链接选项。
相关推荐
似是燕归来9 小时前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发
西门吹-禅10 小时前
java springboot N+1问题
java·开发语言·spring boot
skywalk816310 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
IT笔记11 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode12 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn
逝水无殇12 小时前
C# 运算符重载详解
开发语言·后端·c#
TPBoreas12 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言
额鹅恶饿呃12 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
敲代码的嘎仔13 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森13 小时前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python