Linux线程的终止

1.线程终止的三种情况。
  1. 线程从启动例程中简单返回(return)。
  2. 线程被同一进程中的其它线程取消。
  3. 线程调用pthread_exit()方法。
1.线程终止,并返回数据。
void pthread_exit(void *retval);
2.取消线程。
 int pthread_cancel(pthread_t thread);
3.线程清理处理程序。
void pthread_cleanup_push(void (*routine)(void *),void *arg);
void pthread_cleanup_pop(int execute);
例1.线程清理处理程序执行情况
  1. 线程从启动例程简单返回,即只return,线程清理处理程序不会执行。
  2. 线程调用pthread_exit()方法,线程清理处理程序会执行。
  3. 线程简单返回(return),pthread_cleanup_pop()中的参数为非零时,线程清理处理程序会执行。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>static void cleanup_fun(void *arg){printf("%s: cleanup\n", (char *)arg);
}//简单返回,return
static void *thr_fun1(void *arg){pthread_cleanup_push(cleanup_fun, "thread1 handler1");pthread_cleanup_push(cleanup_fun, "thread1 handler2");if(arg){return ((void *)1);}pthread_cleanup_pop(3);//非零时,线程清理处理程序被调用pthread_cleanup_pop(0);//零时,线程清理处理程序没被调用return ((void *)1);
}static void *thr_fun2(void *arg){pthread_cleanup_push(cleanup_fun, "thread2 handler1");pthread_cleanup_push(cleanup_fun, "thread2 handler2");if(arg){//调用了pthread_exit(),即使pthread_ckeanup_pop()中的参数为0//线程清理处理程序依然执行。pthread_exit((void *)2);}pthread_cleanup_pop(0);pthread_cleanup_pop(0);pthread_exit((void *)2);
}int main(int argc, char const *argv[])
{int err;pthread_t tid1, tid2;void *tret;err = pthread_create(&tid1, NULL, thr_fun1, (void *)0);if(err){fprintf(stderr, "th1 create %s\n", strerror(err));exit(err);}err = pthread_create(&tid2, NULL, thr_fun2, (void *)1);if(err){fprintf(stderr, "th2 create %s\n", strerror(err));exit(err);}err = pthread_join(tid1, &tret);//tret接收子线程返回的值,return返回的也能被接收if(err){fprintf(stderr, "th1 join %s\n", strerror(err));exit(err);}printf("th1 return code: %ld\n", (long)tret);err = pthread_join(tid2, &tret);if(err){fprintf(stderr, "th2 join %s\n", strerror(err));exit(err);}printf("th2 exit code: %ld\n", (long)tret);return 0;
}
执行结果:
thread1 handler2: cleanup
th1 return code: 1
thread2 handler2: cleanup
thread2 handler1: cleanup
th2 exit code: 2
例2.取消线程

执行pthread_cancel()终止线程,线程清理处理程序会被执行。pthread_join()将不会接收到线程启动例程中返回的数据。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>static void clean_fun(void *arg)
{printf("cleanup\n");
}static void *th_fun(void *arg)
{int n = 0;pthread_cleanup_push(clean_fun, NULL);while (1){printf("n = %d\n", n++);sleep(1);}pthread_cleanup_pop(0);return (void *)3;
}int main(int argc, char const *argv[])
{pthread_t tid;void *ret;int err;err = pthread_create(&tid, NULL, th_fun, NULL);if (err){fprintf(stderr, "thread create: %s\n", strerror(err));exit(err);}sleep(5);pthread_cancel(tid);err = pthread_join(tid, &ret);if (err){fprintf(stderr, "thread join: %s\n", strerror(err));exit(err);}printf("ret = %lu\n", (unsigned long)ret);return 0;
}
执行结果:
n = 0
n = 1
n = 2
n = 3
n = 4
cleanup
ret = 18446744073709551615//64位机的最大数,强转成int,是-1

Linux线程的终止相关推荐

  1. linux 等待子线程退出,等待一组子线程退出的问题__线程_pthread_join_终止_pthread_detach_释放__169IT.COM...

    请问 Windows下的函数 WaitForMultipleObjects()----等待一组线程的函数 在Linux下如何实现呢? --------------------------------- ...

  2. linux取消线程的原理,linux线程的取消(终止)方法

    关键: pthread_cancel函数发送终止信号 pthread_setcancelstate函数设置终止方式 pthread_testcancel函数取消线程(另一功能是:设置取消点) 1 线程 ...

  3. Linux 线程与进程,以及通信

    http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...

  4. Linux线程-互斥锁pthread_mutex_t

    Linux线程-互斥锁pthread_mutex_t 在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init, ...

  5. 【Linux开发】彻底释放Linux线程的资源

    Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的.而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出 ...

  6. linux线程并不真正并行,Linux系统编程学习札记(十二)线程1

    Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...

  7. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  8. 3线程的终止方式,线程属性,NPTL

     1线程终止方式 如果需要只终止某个线程而不终止整个线程,可以有三种方法: A:从主线程函数return.这种方法对主线程不适合,从main函数return相当于调用exit. B:一个线程可以调 ...

  9. 【Linux系统编程】Linux线程浅析

    00. 目录 文章目录 00. 目录 01. 进程和线程区别 02. LinuxThreads 03. NPTL 04. NGPT 05. 附录 01. 进程和线程区别 在许多经典的操作系统教科书中, ...

  10. 【Linux系统编程】Linux 线程浅析

    进程和线程的区别与联系 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至 ...

最新文章

  1. 阅读10、11、12章
  2. CVPR-2021收集
  3. Mybatis的核心——SqlSession解读
  4. 每个网页设计者都自以为是
  5. 货物与产品的区别_超市货架和仓储式货架有什么区别?
  6. ❤️《10个超级常用Python方法总结》复制即用丨小白捷径【文末赠书2本】❤️
  7. VueGoogleMaps在vue中的使用
  8. P1828 香甜的黄油 Sweet Butter (spfa)
  9. struts2 + ajax 用户名登录验证(struts2+spring+ibatis)
  10. 基础02Random类、ArrayList类
  11. JS中使用MD5进行字符串加密
  12. Java常用软件下载地址
  13. 转帖:三种快乐物质——多巴胺、血清素、内啡肽
  14. Java简单循环依赖的解决 —— spring_imitate(Spring的模仿)
  15. C语言:memcmp()。
  16. android 模拟器su,修改Android模拟器的system分区,以及加入SuperSU
  17. python和ruby对比
  18. Cython基础使用
  19. c语言判断一个数独是否合法,判断数独是否合法
  20. Python爬虫监控(邮件和钉钉)

热门文章

  1. 毕业设计 - 题目:基于深度学习的人脸表情识别 - 卷积神经网络 毕设 代码
  2. 基于深度学习的人脸表情识别实现
  3. 怎样让网站显示在 Google 搜索结果中?
  4. 简道云-第4章-表单实例
  5. Android插件化实现方案
  6. devcpp 的各种快捷键
  7. 网易云音乐APP分析
  8. Visio2016绘制框图的基本操作方法
  9. 游戏计算机代码大全,DNF各类错误代码大全及解决方法
  10. 删除自己添加的注册表,删除注册表