Linux线程的终止
Linux线程的终止
1.线程终止的三种情况。
- 线程从启动例程中简单返回(return)。
- 线程被同一进程中的其它线程取消。
- 线程调用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.线程清理处理程序执行情况
- 线程从启动例程简单返回,即只return,线程清理处理程序不会执行。
- 线程调用pthread_exit()方法,线程清理处理程序会执行。
- 线程简单返回(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线程的终止相关推荐
- linux 等待子线程退出,等待一组子线程退出的问题__线程_pthread_join_终止_pthread_detach_释放__169IT.COM...
请问 Windows下的函数 WaitForMultipleObjects()----等待一组线程的函数 在Linux下如何实现呢? --------------------------------- ...
- linux取消线程的原理,linux线程的取消(终止)方法
关键: pthread_cancel函数发送终止信号 pthread_setcancelstate函数设置终止方式 pthread_testcancel函数取消线程(另一功能是:设置取消点) 1 线程 ...
- Linux 线程与进程,以及通信
http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-i ...
- Linux线程-互斥锁pthread_mutex_t
Linux线程-互斥锁pthread_mutex_t 在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init, ...
- 【Linux开发】彻底释放Linux线程的资源
Linux系统中程序的线程资源是有限的,表现为对于一个程序其能同时运行的线程数是有限的.而默认的条件下,一个线程结束后,其对应的资源不会被释放,于是,如果在一个程序中,反复建立线程,而线程又默认的退出 ...
- linux线程并不真正并行,Linux系统编程学习札记(十二)线程1
Linux系统编程学习笔记(十二)线程1 线程1: 线程和进程类似,但是线程之间能够共享更多的信息.一个进程中的所有线程可以共享进程文件描述符和内存. 有了多线程控制,我们可以把我们的程序设计成为在一 ...
- linux 线程pthread_detach,linux线程之pthread_join和pthread_detach
在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...
- 3线程的终止方式,线程属性,NPTL
1线程终止方式 如果需要只终止某个线程而不终止整个线程,可以有三种方法: A:从主线程函数return.这种方法对主线程不适合,从main函数return相当于调用exit. B:一个线程可以调 ...
- 【Linux系统编程】Linux线程浅析
00. 目录 文章目录 00. 目录 01. 进程和线程区别 02. LinuxThreads 03. NPTL 04. NGPT 05. 附录 01. 进程和线程区别 在许多经典的操作系统教科书中, ...
- 【Linux系统编程】Linux 线程浅析
进程和线程的区别与联系 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至 ...
最新文章
- 阅读10、11、12章
- CVPR-2021收集
- Mybatis的核心——SqlSession解读
- 每个网页设计者都自以为是
- 货物与产品的区别_超市货架和仓储式货架有什么区别?
- ❤️《10个超级常用Python方法总结》复制即用丨小白捷径【文末赠书2本】❤️
- VueGoogleMaps在vue中的使用
- P1828 香甜的黄油 Sweet Butter (spfa)
- struts2 + ajax 用户名登录验证(struts2+spring+ibatis)
- 基础02Random类、ArrayList类
- JS中使用MD5进行字符串加密
- Java常用软件下载地址
- 转帖:三种快乐物质——多巴胺、血清素、内啡肽
- Java简单循环依赖的解决 —— spring_imitate(Spring的模仿)
- C语言:memcmp()。
- android 模拟器su,修改Android模拟器的system分区,以及加入SuperSU
- python和ruby对比
- Cython基础使用
- c语言判断一个数独是否合法,判断数独是否合法
- Python爬虫监控(邮件和钉钉)