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. ELK部署详解--kibana

    kibana.yml # Kibana is served by a back end server. This setting specifies the port to use.#端口server ...

  2. luogu4602 混合果汁 (主席树)

    按照美味值从大到小排序,对于每个询问,我想二分找到一个前缀来满足条件 那么以单价为下标建主席树,维护区间的最大体积和 以及满足这个最大体积需要的价钱 然后二分答案,再在主席树上二分,找到恰好满足的那个 ...

  3. SSH防暴力破解脚本

    crontab -e 编辑添加一下内容 1 1 * * * sh /root/bin/Denyhosts.sh 脚本内容 #!/bin/bash #Denyhosts SHELL SCRIPT #20 ...

  4. hdu 2594 Simpsons’ Hidden Talents(扩展kmp)

    Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’ ...

  5. Codeforces1076D. Edge Deletion(最短路树+bfs)

    题目链接:http://codeforces.com/contest/1076/problem/D 题目大意: 一个图N个点M条双向边.设各点到点1的距离为di,保证满足条件删除M-K条边之后使得到点 ...

  6. 关于vue的小实例

    学习网址:http://www.runoob.com/vue2/vue-tutorial.html 下面是我在上面学着写的两个小例子, 1. 实现点击全选,下面的均被选中,再点击一下,下面的均取消选择 ...

  7. slave have equal MySQL server UUIDs

    在部署MySQL主从复制架构的时候,碰到了"Last_IO_Error: Fatal error: The slave I/O thread stops because master and ...

  8. springcloud学习笔记

    一.什么是springcloud,有什么作用 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消 ...

  9. Java工具之上传文件

    4个代码 1.前端JSP 2.自定义异常类 3.文件上传抽象类 4.Servlet 1.JSP <%@ page contentType="text/html;charset=UTF- ...

  10. JAVA核心技术I---JAVA基础知识(知识回顾)

    一:多态问题 class Father { public void hello() { System.out.println("Father says hello."); } } ...