三十八、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(深度卷积网络 ...
随机推荐
- 【原】cpu消耗高,查看对应的线程栈信息
在压测过程中,有时候cpu会飙升,造成这种现象的原因很多, 可能是gc造成的,也可能是某个方法造成的, 如果从找对应的方法入手,下面简单罗列下步骤: 1.top,获取pid 下面cpu消耗90%左右 ...
- centos7下利用httpd2.4配置svn并使用Ldap用户认证
应用场景:Windows下有AD活动目录,类Unix系统下有Ldap,在运维开发工具平台逐步丰富的现在,统一用户管理大大便捷了管理人员. 其中不乏经典版本控制管理工具svn,与Ldap组合的用户认证方 ...
- java 各种数据类型判断为空
一,基本数据类型 八种基本类型有默认值 http://www.runoob.com/java/java-basic-datatypes.html 二,String 对象 // 判断String为空 / ...
- js 读取包含特殊字符的属性值
在JS中对象的属性可以通过两种方式访问:object.property和object["property"]. 包含特殊字符的属性只能以此方式访问: object["pr ...
- 利用selenium并使用gevent爬取动态网页数据
首先要下载相应的库 gevent协程库:pip install gevent selenium模拟浏览器访问库:pip install selenium selenium库相应驱动配置 https: ...
- ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数
资料来自: http://blog.csdn.net/holamirai/article/details/47948745 http://www.cnblogs.com/wanghao111/arch ...
- linux:awk修改输出分隔符
file1的内容如下: a b c d e f g h 现在想要修改成 a b c:d e f g:h 则需要用到如下命令: awk -F " " '{print $1,$2,$3 ...
- 网络流n题
近日好不容易在自救之路写完暑训遗留下来的网络流8题,在此回顾一下. Going Home POJ - 2195 题意:m要去H,一个H只能容纳一个m,一步一块钱,问最小花费. 思路:最小费用最大流的板 ...
- Lucas定理学习笔记(没有ex_lucas)
题目链接\(Click\) \(Here\) \(ex\_lucas\)实在是不能学的东西...简单学了一下\(Lucas\)然后打算就这样鸽着了\(QwQ\)(奶一口不可能考) 没什么复杂的,证明的 ...
- [USACO07NOV] Milking Time
题目链接 动态规划转化成 DAG 然后拓扑求解的思路 虽然很简单不过感觉这个新思路会很有用! 如果两个事件互不影响并且有先后关系,就可以连一条有向边,跑最长路可以得到最后的最优解 实际上这还是个背包… ...