当前位置: 首页 > news >正文

多线程编程 ----线程主动退出pthread_exit与线程被动退出pthread_cancel

主动退出 pthread_exitpthread_cancel 的区别

1. 核心区别
特性pthread_exitpthread_cancel
调用者线程自身调用,主动退出。其他线程调用,异步请求终止目标线程。
行为方式立即终止线程,资源需手动释放。发送取消请求,线程在取消点终止。
返回值可通过 pthread_join 获取返回值。线程返回 PTHREAD_CANCELED
取消点依赖无需取消点,立即生效。需线程到达取消点(如 sleep 等函数)。
资源管理pthread_join 回收资源。需处理线程终止后的资源释放。

2. 详细对比
2.1 调用者与触发方式
  • pthread_exit

    • 由线程自身调用,用于主动结束执行。
    • 示例:
      void *thread_func(void *arg) {printf("Thread exiting\n");pthread_exit(NULL);  // 主动退出
      }
      
  • pthread_cancel

    • 由其他线程调用,向目标线程发送终止请求。
    • 示例:
      pthread_t tid;
      pthread_create(&tid, NULL, thread_func, NULL);
      pthread_cancel(tid);  // 其他线程请求终止 tid
      
2.2 终止行为
  • pthread_exit

    • 立即终止线程,资源(如栈空间)需通过 pthread_join 回收。
    • 可传递返回值:
      void *ret = "exit_value";
      pthread_exit(ret);  // 返回值可被 pthread_join 获取
      
  • pthread_cancel

    • 异步请求,线程可能在取消点(如 sleep, read 等系统调用)终止。
    • 线程终止时返回 PTHREAD_CANCELED
    • 取消点依赖
      • 线程需启用取消功能(默认启用)。
      • 取消类型(PTHREAD_CANCEL_ASYNCHRONOUSPTHREAD_CANCEL_DEFERRED)影响终止时机。
2.3 资源管理
  • pthread_exit

    • 线程终止后,资源需通过 pthread_join 回收:
      void *ret;
      pthread_join(tid, &ret);  // 等待线程结束并回收资源
      
  • pthread_cancel

    • 线程终止后,资源同样需 pthread_join 回收。
    • 若线程处于分离状态(pthread_detach),资源自动释放。
2.4 典型场景
  • pthread_exit

    • 线程完成逻辑后主动退出。
    • 示例:
      void *task(void *arg) {// 执行任务...pthread_exit(NULL);  // 任务完成,退出
      }
      
  • pthread_cancel

    • 强制终止长时间运行的线程。
    • 示例:
      void *infinite_loop(void *arg) {while (1) {  // 无限循环,无取消点// 耗时操作...}
      }int main() {pthread_t tid;pthread_create(&tid, NULL, infinite_loop, NULL);// 需设置取消类型为异步,否则无法终止pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);pthread_cancel(tid);  // 强制终止pthread_join(tid, NULL);return 0;
      }
      

3. 总结
  • 主动 vs 被动pthread_exit 是线程自主动作,pthread_cancel 是外部强制终止。
  • 立即生效 vs 取消点依赖pthread_exit 立即终止,pthread_cancel 需线程到达取消点。
  • 返回值处理pthread_exit 可传递返回值,pthread_cancel 返回固定值 PTHREAD_CANCELED
  • 资源管理:两者均需 pthread_join 回收资源(除非线程已分离)。

注意:使用 pthread_cancel 时需谨慎,确保线程可被安全终止(如避免资源泄漏)。

http://www.lqws.cn/news/535843.html

相关文章:

  • DAY 33 简单的神经网络
  • 前端面试专栏-主流框架:14. Vue Router与Vuex核心应用
  • Spring Boot使用Redis常用场景
  • Python爬虫多线程并发时的503错误处理最佳实践
  • HTTP-Cookie和Session
  • 算法第48天|单调栈:42. 接雨水、84.柱状图中最大的矩形
  • 鸿蒙边缘智能计算架构实战:从环境部署到分布式推理全流程
  • window显示驱动开发—DirectX 图形内核子系统(一)
  • 树莓派超全系列教程文档--(67)rpicam-apps可用选项介绍之检测选项
  • 算法-最大子数组
  • 【Python】For
  • Agentic AI爆发前夜,合作伙伴如何把握时代机遇?
  • 2D写实交互数字人如何重塑服务体验?
  • MP1652GTF-Z:MPS高效3A降压转换器 工业5G通信专用
  • windows内核句柄判断有效
  • LeetCode刷题-top100(和为 K 的子数组)
  • ISP Pipeline(4): Anti Aliasing Noise Filter 抗锯齿与降噪滤波器
  • 【thinkphp5】Session和Cache记录微信accesstoken
  • QT实现一个三轴位移台的控制界面
  • QT Creator构建失败:-1: error: Unknown module(s) in QT: serialport
  • 【CMake基础入门教程】第七课:查找并使用第三方库(以 find_package() 为核心)
  • 【缓存技术】深入分析如果使用好缓存及注意事项
  • Flux.create
  • Linux 内核 TCP 的核心引擎:tcp_input.c 与 tcp_output.c 的协同之道
  • ubuntu安装docker遇到权限问题
  • TCP 重传机制详解:原理、变体与故障排查应用
  • 利用python和libredwg库解析dwg格式文件输出GeoJSON
  • Mac电脑如何搭建基于java后端的开发的各种工具服务
  • 自动获取文件的内存大小怎么设置?批量获取文件名和内存大小到Excel中的方法
  • IDEA下载不了插件了怎么办?从本地导入插件详细教程!