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. thinkphp5 上传服务器后 Access denied

    服务器报 Access denied,要么报 No input files,但是在网上查了查说是将 PHP 的cgi.fix_pathinfo 改成 1 即可,但是改成 1 显然是有解析漏洞的,尝试寻 ...

  2. js jquery 判断元素是否在数组内

    js jquery 判断元素是否在数组内 一,js方法 var arr = ["a", "b", "c"]; // js arr.index ...

  3. A1110. Complete Binary Tree

    Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each in ...

  4. 【洛谷P2568】GCD

    题目大意:给定整数 \(N\),求\(1\le x,y\le N\) 且 \(gcd(x,y)\) 为素数的数对 \((x,y)\) 有多少对. 题解: \[ \sum_{p \in \text { ...

  5. 登录rabbitmq报错User can only log in via localhost

    在访问管理界面使用guest用户登录时出现login failed错误. 到服务器上查询日志显示出现错误的原因是:HTTP access denied: user ‘guest’ - User can ...

  6. 利用sqlalchemy读取数据库 和pandas的Dataframe对象 互相生成

    #导入pandas import pandas as pd import numpy as np #导入SqlAlchemy from sqlalchemy import create_engine ...

  7. Django 创建超级用户

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制 #创建超级用户 python manage.py creat ...

  8. 真机控件获取 app-inspector

    1.安装app-inspector:npm  install  app-inspector  -g 若是要卸载原有的:npm   uninstall   app-inspector   -g   np ...

  9. 华为2018软件岗笔试题之第一题python求解分享

    闲来无事,突然看到博客园首页上有人写了篇了华为2018软件岗笔试题解题思路和源代码分享.看了下题目,感觉第一题能做出来,就想着用刚刚学的python试着写一下,花费的时间有点长~~,看来又好长时间没练 ...

  10. linux:提取匹配含有小数点的数字(grep函数)

    学艺不精,一开始用了 “grep -ne '46.5743' file.txt” 提取含有46.5743的小数不成功,后面查资料才知道正则表达式中,小数点代表的是:一定有一个任意字节. 正确的写法应该 ...