linux+分离线程+退出,Linux 进程与线程二(等待--分离--取消线程)

int pthread_join(pthread_t thr,void **thr_return);

pthread_join函数用于挂起当前线程,直至th指定的线程终止为止。

如果另一个线程返回值不是NULL,则保存在thr_return地址中。

一个线程所使用的内存资源在应用pthread_join调用之前不会被重新分配,所以对于每个线程必须调用一次pthread_join函数(被分离线程除外)。

其他线程不能对同一线程再应用pthread_join调用。

pthread_join函数成功返回0,失败返回错误码

参数thr_return就是线程th的返回值

这个函数的应用场景一般是在控制线程中调用,用来等待其他线程返回,跟进程中wait()函数类似。

一个线程退出后(在控制线程不退出的情况下),该线程所使用的内存资源并没有被释放,需要调用pthread_join()函数释放。

//pthread_join的使用

#include

#include

#include

#include

#include

#include

void * Myfunc(void *arg)

{

int *p = (int *) malloc(sizeof(int));

if (p == NULL)

{

printf("分配内存失败!\n");

return NULL;

}

*p = ;

return p;

}

void * Myfunc2(void *arg)

{

int *p = (int *) malloc(sizeof(int));

if (p == NULL)

{

printf("分配内存失败!\n");

return NULL;

}

*p = ;

pthread_exit(p);

}

int main(int arg, char *args[])

{

pthread_t thr1, thr2;

if (pthread_create(&thr1, NULL, Myfunc, NULL) != )

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));

return -;

}

if (pthread_create(&thr2, NULL, Myfunc2, NULL) != )

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));

return -;

}

int *returnnum1 = NULL;

int *returnnum2 = NULL;

/*

pthread_join()函数主要的量大的功能

1.将控制线程挂起,等待指定的线程返回

2.释放指定的线程的内存资源(线程正常退出并没有释放自身占用的资源,除非进程退出)

*/

pthread_join(thr1, (void **) &returnnum1);

if (returnnum1 != NULL)

{

printf("thr1 return number is %d\n", *returnnum1);

}

pthread_join(thr2, (void **) &returnnum2);

if (returnnum2 != NULL)

{

printf("thr2 return number is %d\n", *returnnum2);

}

return ;

}

int pthread_detach(pthread_t th);

pthread_detach函数使线程处于被分离状态。

对于被分离状态的线程,同时对线程的返回值不感兴趣,可以设置这个线程被分离状态,让系统在线程退出的时候自动回收它所占用的资源。

一个线程不能自己调用pthread_detach改变自己被分离状态,只能由其他线程调用pthread_detach。

一旦线程成为可分离线程之后,就不能再使用pthread_joisn()函数了,因为没有意义。

pthread_detach()成功返回0,失败返回错误码。

线程处于被分离状态下,控制线程退出,被分离线程也会退出,被分离线程只是不需要使用pthread_join函数来释放内存资源。

可分离线程的使用场景

.主线程不需要等待子线程

.主线程不关心子线程的返回码

//pthread_detach的使用

#include

#include

#include

#include

#include

#include

void * Myfunc(void *arg)

{

while()

{

printf("fly with me \n");

sleep();

}

return NULL;

}

int main(int arg, char *args[])

{

pthread_t thr1;

if (pthread_create(&thr1, NULL, Myfunc, NULL) != )

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));

return -;

}

pthread_detach(thr1);

sleep();

printf("main end \n");

return ;

}

int pthread_cancel(pthread_t th);

pthread_cancel函数允许一个线程取消th指定的另一个线程

函数成功返回0,失败返回非0.

//pthread_join的使用

#include

#include

#include

#include

#include

#include

void * Myfunc(void *arg)

{

while ()

{

printf("fly with me \n");

sleep();

}

int *p = malloc(sizeof(int));

*p = ;

return p;

}

void * Myfunc2(void *arg)

{

if(arg==NULL)

{

printf("param is not allow NULL!\n");

return NULL;

}

sleep();

pthread_t thr;

thr=*(pthread_t *)arg;

pthread_cancel(thr);

int *p = malloc(sizeof(int));

*p = ;

return p;

}

int main(int arg, char *args[])

{

pthread_t thr1, thr2;

if (pthread_create(&thr1, NULL, Myfunc, NULL) != )

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));

return -;

}

if (pthread_create(&thr2, NULL, Myfunc2, &thr1) != )

{

printf("create thread is failed ! error message :%s\n",

strerror(errno));

return -;

}

int *numx1 = NULL;

int *numx2 = NULL;

pthread_join(thr1, (void **) &numx1);

pthread_join(thr2, (void **) &numx2);

/*

程序报错,线程thr1在执行中被强制取消,返回值numx1并不是NULL

*/

/*

if (numx1 != NULL)

{

printf("thr1 return code is %d\n", *numx1);

free(numx1);

numx1 = NULL;

}

*/

if (numx2 != NULL)

{

printf("thr2 return code is %d\n", *numx2);

free(numx2);

numx2 = NULL;

}

printf("main end \n");

return ;

}

linux进程管理(二)

接上[linux进程管理(一)] 终止进程的工具 kill .killall.pkill 终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ...

Linux进程控制(二)

1. 进程的创建 Linux下有四类创建子进程的函数:system(),fork(),exec*(),popen() 1.1. system函数 原型: #include

Linux进程管理(二、 进程创建)

通常使用fork创建进程, 也可以用vfork()和clone().fork.vfork和clone三个用户态函数均由libc库提供,它们分别会调用Linux内核提供的同名系统调用fork,vfork ...

[Java][Android] 多线程同步-主线程等待全部子线程完毕案例

有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

从源码解读线程(Thread)和线程池(ThreadPoolExecutor)的状态

线程是比进程更加轻量级的调度执行单位,理解线程是理解并发编程的不可或缺的一部分:而生产过程中不可能永远使用裸线程,需要线程池技术,线程池是管理和调度线程的资源池.因为前不久遇到了一个关于线程状态的问题 ...

Java 之 线程的生命周期(线程状态)

一.线程的生命周期 (1)新建状态 new 好了一个线程对象,此时和普通的 Java对象并没有区别. (2)就绪 就绪状态的线程是具备被CPU调用的能力和状态,也只有这个状态的线程才能被CPU调用.即 ...

Linux进程与线程的区别

进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...

Py修行路 python基础 (二十五)线程与进程

操作系统是用户和硬件沟通的桥梁 操作系统,位于底层硬件与应用软件之间的一层 工作方式:向下管理硬件,向上提供接口 操作系统进行切换操作: 把CPU的使用权切换给不同的进程. 1.出现IO操作 2.固定 ...

Linux学习笔记23——取消线程

一 相关函数 1 发送终止信号 #include int pthread_cancel(pthread_t thread); 2 设置取消状态 #include & ...

随机推荐

Centos6_64 rpm打包实践

安装rpmbuild sudo yum install rpm-build 普通用户的配置 /home/you/rpmbuild/ 假设是要构建rpm的目录 先说说rpmbuild有什么用,给一个例子 ...

关于strcpy_s

#include"stdafx.h" #include #include int main() { using nam ...

JMeter工具的使用-ForEach

1,Add Thread group this detail information about this panel as below link http://jmeter.apache.org/u ...

spring data redis RedisTemplate操作redis相关用法

http://blog.mkfree.com/posts/515835d1975a30cc561dc35d spring-data-redis API:http://docs.spring.io/sp ...

verilog之task用法实例

该用法的代码源自夏宇闻老师的教材. 源代码: module traffic_lights; reg clock, red, amber, green; , off = , red_tics = , a ...

QTcpSever和QTcpSocket实现多线程客户端和服务端;

QTcpServer提供了newConnection信号, 可以通过connect实现连接槽函数,利用nextPendingConnection 函数获取连接的QTcpSocket * :也可以继承Q ...

oracle里实例和数据库之间的关系

一个数据库服务器上可以装几个数据库它们都是用sid来标志,例如orcl1,orcl2,orcl3等等,一个数据库如orcl1中可以有多个实例吗? Oracle数据库,实际上应该是说,我们使用的是Ora ...

Django model 字段类型及选项解析

字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...

python自学第三天,列表

1.列表 names=[] #这就是一个空列表 names=[1,5,2,3,4,5]#列表是用的中括号,每个元素是用逗号分开的.列表里面的元素是可以重复的. names[-1]#表示的是取列表的最后 ...

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值