三十八、Linux 线程——线程属性初始化、销毁、设置和获得分离属性
38.1 线程属性初始化和销毁
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
- 返回值:成功返回 0;否则,返回错误编号
线程属性结构如下:

38.2 设置和获得分离属性
#include <pthread.h>
int pthread_attr_getdetachstat(const pthread_attr_t *restrict attr,
int *detachstate);
int pthread_attr_setdetachstat(const pthread_attr_t *attr
int detachstate);
- detachstate 取值:
- PTHREAD_CREATE_JOINABLE(默认值) 正常启动线程
- 必须调用 pthread_join 才能释放线程占有的资源
- PTHREAD_CREATE_DETACHED 以分离状态启动线程
- 可以不调用 pthread_join,在线程结束后,会自动释放占有的资源
- PTHREAD_CREATE_JOINABLE(默认值) 正常启动线程
- 以默认方式启动的线程,在线程结束后不会自动释放占有的系统资源,要在主控线程中调用 pthread_join() 后才会释放。
- 以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源
- 分离属性在网络通讯中使用的较多
38.3 例子
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h> void out_state(pthread_attr_t *attr)
{
int state;
if(pthread_attr_getdetachstate(attr, &state) != ){
perror("getdetachstate error");
}
else{
if(state == PTHREAD_CREATE_JOINABLE){
printf("joinable state\n");
}
else if(state == PTHREAD_CREATE_DETACHED){
printf("detached state\n");
}
else {
printf("error state\n");
}
}
} void *th_fn(void *arg)
{
int i;
int sum = ;
for(i = ; i <= ; i++){
sum += i;
}
return (void *)sum;
} int main(void)
{
int err;
pthread_t default_th, detach_th; /** 定义线程属性 */
pthread_attr_t attr;
/** 对线程属性初始化 */
pthread_attr_init(&attr);
/** 输出分离属性 */
out_state(&attr); /** 取分离属性的默认值,以正常方式启动子线程 */
if((err = pthread_create(&default_th, &attr, th_fn, (void *))) != ) {
perror("pthread create perror");
}
int res;
if((err = pthread_join(default_th, (void *)&res)) != ){
perror("pthread join error");
}
else {
printf("default return is %d\n", (int )res);
}
printf("-------------------------------------------------\n"); /** 以分离状态启动子线程 */
/** 设置分离属性 */
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
out_state(&attr);
if((err = pthread_create(&detach_th, &attr, th_fn, (void *))) != ) {
perror("pthread create perror");
}
69 if((err = pthread_join(detach_th, (void *)&res)) != 0){
70 perror("pthread join error");
71 }
72 else {
73 printf("detach is %d\n", (int )res);
74 }
/** 销毁线程属性 */
pthread_attr_destroy(&attr);
printf("0x%lx finished\n", pthread_self());
sleep(); return ;
}
在例子中,对分离状态的线程使用 pthread_join 进行回收,编译运行结果:

第 70 行报了错误,但是依然是成功,改用 fprintf 进行错误码输出:

修改后,运行结果:

说明 join 函数并没有调用到返回值,分离的线程已经自动释放了
三十八、Linux 线程——线程属性初始化、销毁、设置和获得分离属性的更多相关文章
- 孤荷凌寒自学python第三十九天python 的线程锁Lock
孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: [好消息] ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Deep learning:三十八(Stacked CNN简单介绍)
http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...
随机推荐
- iptables(4)规则编写
/etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Tue Mar 20 15:05:33 2018*filter:INPUT ...
- poj1845 sumdiv (因数的和)
首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$ 然后的话,它的所有因数的和就是$\prod{(1+p_i^1+p_i^2+...+p_i^n)}$ 用一 ...
- POJ-3687 Labeling Balls(拓扑)
不一样的拓扑排序 给定一些标记为1到n的数, 求出满足a < b 的序列, 如果有多个输出, 按先标签1往前的位置, 然后按标签2往前的位置, 对于每个标签, 位置都尽量往前. 因为位置要往前, ...
- Git中撤销提交
Git的几种状态 未修改 原始内容 已修改 ↓ 工 作 区 已暂存 ↓ git add 暂 存 区 已提交 ↓ git commit 本地仓库 已推送 ↓ git push 远程仓库 注意:下面所有命 ...
- Python经典算法片段
将一个正整数分解质因数 #!/bin/env python2 # -*- coding: UTF-8 -*- def reduceNum(n): print '{} = '.format(n), if ...
- linux服务器上tomcat日志中的中文乱码
转: 修改tomcat应用日志默认编码格式 前言 今天开发跟我说tomcat日志中的中文不能正常显示,根据以往的经验,我觉得可能跟服务器的编码有关,于是尝试各种方法,但还是没能解决问题. 后来我突然想 ...
- GUI 设计
GUI(图形化界面编程) Graphical User Interface (java.Awt javax.Swing) CLI(命令行操作接口) Command line User ...
- 线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程
一. pthread_create() #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_a ...
- maven编译或者打包web项目显示“软件包 javax.servlet.http 不存在"
2.解决办法: 这是由于缺少servlet-api.jar包,其实tomcat下有,但是在java build path把他加载过来,还是报这个错误,所以我们直接在pom.xml里面加入这个jar包即 ...
- mysql5.6.40单实例安装二进制快捷安装
mysql5.6.40单实例安装二进制快捷安装 近期因不同环境需要不同版本的mysql实例,故为了方便操作,特此记录下来,方便自己查找. # 1.1.Centos最小化安装推荐常用依赖包 yum cl ...