Linux多线程编程入门
作者:yqtaowhu 发布时间:[ 2017/2/22 10:40:38 ] 推荐标签:操作系统 线程 Linux
5.2 线程的分离
有时我们并不在乎某个线程是不是已经终止了,我们只是希望如果某个线程终止了,系统能自动回收掉该终止线程所占用的资源。pthread_detach函数为我们提供了这个功能,该功能称为线程的分离:
#include <pthread.h>
int pthread_detach(pthread_t thread);
默认情况下,一个线程终止了,是需要在被连接后系统才能回收其占有的资源的。如果我们调用pthread_detach函数去分离某个线程,那么该线程终止后系统将自动回收其资源。
/*
* 文件名: thread_sample1.c
* 描述:演示线程基本操作
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
/*子线程1入口函数*/
void *thread_routine1(void *arg)
{
fprintf(stdout, "thread1: hello world! ");
sleep(1);
/*子线程1在此退出*/
return NULL;
}
/*子线程2入口函数*/
void *thread_routine2(void *arg)
{
fprintf(stdout, "thread2: I'm running... ");
pthread_t main_thread = (pthread_t)arg;
/*分离自我,不能再被连接*/
pthread_detach(pthread_self());
/*判断主线程ID与子线程2ID是否相等*/
if (!pthread_equal(main_thread, pthread_self())) {
fprintf(stdout, "thread2: main thread id is not equal thread2 ");
}
/*等待主线程终止*/
pthread_join(main_thread, NULL);
fprintf(stdout, "thread2: main thread exit! ");
fprintf(stdout, "thread2: exit! ");
fprintf(stdout, "thread2: process exit! ");
/*子线程2在此终止,进程退出*/
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
/*创建子线程1*/
pthread_t t1;
if (pthread_create(&t1, NULL, thread_routine1, NULL)!=0) {
fprintf(stderr, "create thread fail. ");
exit(-1);
}
/*等待子线程1终止*/
pthread_join(t1, NULL);
fprintf(stdout, "main thread: thread1 terminated! ");
/*创建子线程2,并将主线程ID传递给子线程2*/
pthread_t t2;
if (pthread_create(&t2, NULL, thread_routine2, (void *)pthread_self())!=0) {
fprintf(stderr, "create thread fail. ");
exit(-1);
}
fprintf(stdout, "main thread: sleeping... ");
sleep(3);
/*主线程使用pthread_exit函数终止,进程继续存在*/
fprintf(stdout, "main thread: exit! ");
pthread_exit(NULL);
fprintf(stdout, "main thread: never reach here! ");
return 0;
}
终的执行结果如下:
thread1: hello world!
main thread: thread1 terminated!
main thread: sleeping...
thread2: I'm running...
thread2: main thread id is not equal thread2
main thread: exit!
thread2: main thread exit!
thread2: exit!
thread2: process exit!
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Linux下开源的DDR压力测试工具曝Linux恶意软件:让树莓派设备挖掘数字货币linux系统中不同颜色的文件夹及根目录介绍软件测试工程师必知必会Linux命令Linux下DNS服务器配置如何成为不可替代的Linux运维工程师?详解Linux进程(作业)的查看和杀死Linux 日志定时轮询流程详解比特币勒索病毒不只Windows系统有,Linux版的来了Linux日志定时轮询流程详解Linux iommu和vfio概念空间解构Linux系统如何低于TCP洪水攻击Linux无损调整分区大小Linux下防火墙配置实例Linux使用Jexus托管Asp.Net Core应用程序Linux中引号的那些事
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南