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_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 线程——线程属性初始化、销毁、设置和获得分离属性的更多相关文章

  1. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  2. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. 微信小程序把玩(三十八)获取设备信息 API

    原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...

  4. 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)

    1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...

  5. Java进阶(三十八)快速排序

    Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...

  6. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  7. 【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)

    转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: [好消息] ...

  8. bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. Deep learning:三十八(Stacked CNN简单介绍)

    http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...

随机推荐

  1. LOJ#510 北校门外的回忆(找性质+倍增+线段树)

    这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...

  2. 【UR #3】链式反应

    http://uoj.ac/problem/50 %炮姐 好博客 树形结构 枚举根节点的儿子是哪两个 然后列出方程: 然后有EGF的影子! 倍增? 泰勒展开可以把未知数从函数里拿出来!并且变成1次项, ...

  3. tyvj/joyoi 1336 火车进栈

    比原题水了很多(因为原题要高精度) 输出字典序前20种出栈序列. 其实是贪心题:我们每次确定一个出栈的数. 当栈里有数时,字典序显然比从后面拿数要小,所以先搜这个. 之后依次搜后面队列里的数,因为字典 ...

  4. ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数

    资料来自: http://blog.csdn.net/holamirai/article/details/47948745 http://www.cnblogs.com/wanghao111/arch ...

  5. django引入模板时,部分css文件渲染不成功失灵引入不成功

    今天碰到了一件怪事,下载好的模板,在webstorm中就好好地,但是一引入到pycharm的django项目中就各种失灵,位置错乱. 检查一番,发现该设置的都设置对了啊,而且js文件和css文件还有一 ...

  6. java 中 byte[]、File、InputStream 互相转换

    1.将File.FileInputStream 转换为byte数组: File file = new File("test.txt"); InputStream input = n ...

  7. linux系统调用之网络管理1

    getdomainname 取域名 setdomainname 设置域名 gethostid 获取主机标识号 sethostid 设置主机标识号 gethostname 获取本主机名称 sethost ...

  8. C++自定义NULLPTR

    惊奇的发现C++中连NULL和nullptr都有区别 NULL和nullptr 根据文章,应当做好NULL和nullptr的兼容工作 翻阅了一下qt的宏定义 #ifdef __GNC__ #defin ...

  9. JMeter-Java压力测试工具-01

    先去官网下载 打开 下面测试一个小栗子 建立一个工程,提供一个查询接口 package com.example.demo; import org.springframework.web.bind.an ...

  10. java基础入门-语法(1)

    因为平时用到一些java的项目,比如ElasticSearch,zookeeper等,有时也想看看里面怎么实现的,或者看到别人分析原理时候会用到java源码, 自己也想跟着学一下,最起码能看懂别人的分 ...