线程终止(一)

本文探讨了在Unix/Linux环境下,线程如何终止,包括通过正常退出、被其他线程取消以及调用pthread_exit()函数。重点讨论了pthread_exit与return在结束线程时的不同,pthread_exit允许指定退出码并执行清理工作,而return仅适用于线程函数,标志着线程的结束。通过实验代码验证了两者的效果差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >






线程终止(一)

线程


退出码

单线程的退出方法 :

  1. 从程序中正常退出, 返回线程的退出码.
  2. 被同一进程的其他线程取消.
  3. 线程调用pthread_exit()函数.
  
  
  1. #include <pthread.h>
  2. void pthread_exit(void *rval ptr)
  3. // 从例程中返回, rval_ptr包含返回码. 如果线程被取消, 返回PTHREAD_CANCELED.
  
  
  1. #include <pthread.h>
  2. int pthread_join(pthread_t thread, void **rval_ptr) // 是一种屏障
  3. // rval_ptr : 保存线程的返回码
  4. // 将thread = NULL, 则对返回值无用;
  5. // pthread_join等待指定的线程终止, 但并不获取线程的终止码
  6. // 成功, 返回 0; 失败, 返回错误编码

在我看书的时候, 一直有这样一个疑问 :
pthread_exit与return的区别

  1. pthread_exit是可以进行推出的清理工作的,包括对局部类的析构。
  2. pthread_exit()用于线程退出,可以指定返回值,以便其他线程通过pthread_join()函数获取该线程的返回值
    return,是函数返回,不一定是线程函数哦! 只有线程函数return,线程才会退出

为此, 我也自己找过方法, 网上的资料也看了, 最后自己总结出来了一段代码, 直接验证上述说的区别.

  
  
  1. /*************************************************************************
  2. > File Name: t.cpp
  3. > Author: Function_Dou
  4. > Mail:
  5. > Created Time: 2018年03月05日 星期一 20时24分05秒
  6. ************************************************************************/
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <stdlib.h>
  10. #include <pthread.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. void *fun1(void)
  14. {
  15. pthread_exit((void *)1);
  16. }
  17. void *thread_fun1(void *)
  18. {
  19. fun1();
  20. return ((void *)0);
  21. }
  22. void *fun2(void)
  23. {
  24. return ((void *)3);
  25. }
  26. void *thread_fun2(void *)
  27. {
  28. fun2();
  29. pthread_exit((void *)2);
  30. }
  31. int main(void)
  32. {
  33. void *tret;
  34. pthread_t tid1, tid2;
  35. // 建立第一个线程
  36. if((errno = pthread_create(&tid1, NULL, thread_fun1, NULL)) != 0)
  37. fprintf(stderr, "pthread_create error : %s\n", strerror(errno));
  38. if((errno = pthread_join(tid1, &tret)) != 0)
  39. fprintf(stderr, "pthread_join error : %s\n", strerror(errno));
  40. // 第一个的返回码
  41. printf("tid1 : %ld\n", (long)tret);
  42. // 建立第二个线程
  43. if((errno = pthread_create(&tid2, NULL, thread_fun2, NULL)) != 0)
  44. fprintf(stderr, "pthread_create error : %s\n", strerror(errno));
  45. if((errno = pthread_join(tid2, &tret)) != 0)
  46. fprintf(stderr, "pthread_join error : %s\n", strerror(errno));
  47. // 第二个的返回码
  48. printf("tid2 : %ld\n", (long)tret);
  49. exit(0);
  50. }

运行结果 : 你会发现, 线程的结束是pthread_exit()函数控制的, 而不是return代表线程结束

  
  
  1. [root@localhost Pthread]# ./a.out
  2. tid1 : 1
  3. tid2 : 2


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值