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

发布于:2025-06-28 ⋅ 阅读:(13) ⋅ 点赞:(0)

主动退出 pthread_exitpthread_cancel 的区别

1. 核心区别
特性 pthread_exit pthread_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 时需谨慎,确保线程可被安全终止(如避免资源泄漏)。


网站公告

今日签到

点亮在社区的每一天
去签到