1、线程属性的设置

 /*************************************************************************
> File Name: pthread_attr.c
> Summary: 线程属性的设置---举例创建线程之时就设置线程分离
> Author: xuelisheng
> Created Time: 2018年12月17日
************************************************************************/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h> void *tfn(void *arg)
{
printf("thread : pid = %d, tid = %lu\n", getpid(), pthread_self());
return NULL;
} int main()
{
pthread_t tid;
// 属性结构体
pthread_attr_t attr; int ret = pthread_attr_init(&attr);
if(ret != ){
fprintf("stderr", "attr_init error:%s\n", strerror(ret));
exit();
} // 设置线程属性
ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(ret != ){
fprintf("stderr", " pthread_attr_setdetachstate error:%s\n", strerror(ret));
exit();
}
//ret = pthread_create(&tid, &attr, tfn, NULL);
ret = pthread_create(&tid, NULL, tfn, NULL);
if(ret != ){
perror("pthread_create error");
} // 销毁
ret = pthread_attr_destroy(&attr);
if(ret != ){
fprintf("stderr", " pthread_attr_destroy error:%s\n", strerror(ret));
exit();
} ret = pthread_join(tid, NULL); // 使用join函数用来验证detach属性是否生效,如果生效则返回值为无效
if(ret != ){
fprintf("stderr", " pthread_join error:%s\n", strerror(ret));
exit();
}
printf("main : pid = %d, tid = %lu\n", getpid(), pthread_self());
pthread_exit((void *));
return ;
}

运行结果:

pthread_join error : Invalid argument

关于上面的demo:

(1)上面的功能实际上可以直接通过使用pthread_detach实现,但是如果创建线程较多,则可以直接在创建线程时直接设置分离属性。

(2)随着一个进程中的线程的数量增多,进程中的栈资源均分的更少,此时可以设置线程属性,来进行堆上空间的开辟,这也是进行线程属性设置的一个应用。

2、线程使用的总结

(1)主线程退出而其他线程不退出,主线程应该调用pthread_exit。

(2)避免僵尸线程:pthread_join、pthread_detach、pthread_create指定分离属性

被join线程可能在join函数返回前就释放自己的所有内存资源,所以不应该返回被回收线程栈中的值。

(3)malloc申请的内存可以被其他线程释放(共享)。

(4)应避免在多线程模型中调用fork,除非立即exec。fork出的子进程中只有调用fork的线程存在,其他线程在子进程中均pthread_exit。

(5)信号的复杂语义很难和多线程共存,所以应避免在多线程中引入信号机制。

【Linux 线程】常用线程函数复习《四》的更多相关文章

  1. php中的常用数组函数(三)(获取数组交集的函数们 array_intersect()、array_intersect_key()、array_intersect_assoc()、array_intersect_uassoc()、array_intersect_ukey())

    这5个获取交集的函数 有 5个对应的获取差集的函数.我是链接. array_intersect($arr1, $arr2); //获得数组同键值的交集 array_intersect_key($arr ...

  2. Linux中常用的函数

    1.devm_kzalloc() 函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数,但是devm_kzalloc()是跟设备(device)有关的,当设备(device ...

  3. Linux 系统常用命令汇总(三) 用户和用户组管理

    用户和用户组管理 命令 选项 注解 示例 useradd [选项] 用户名 新建用户 创建一个名为tester的用户,并指定他的UID为555,指定加入test群,指定其使用C-shell:  use ...

  4. Linux最常用的基本操作复习

    .ctrl + shift + = 放大终端字体 .ctrl + - 缩小终端字体 .ls 查看当前文件夹下的内容 .pwd 查看当前所在的文件夹 .cd 目录名 切换文件夹 .touch 如果文件不 ...

  5. Linux:结束线程的三种方式

    一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止.但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态. ...

  6. Linux可重入函数和线程安全的区别与联系(转)

    *****可重入函数 函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入. 当程序运行到某一个函数的时候,可能因为硬件中断或者异常而使得在用户正在执行的代码暂时终端转而 ...

  7. Linux下通用线程池的创建与使用

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  8. linux系统编程--线程

    安装线程man page,命令:sudo apt-get install manpages-posix-dev 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本 ...

  9. Linux进程间通信与线程间同步详解(全面详细)

    引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496linux下进程间通信的几种主要手段简介: 1. 管道(Pipe)及有名管道( ...

  10. Linux平台下线程池的原理及实现

    转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为换工作的事,一直也没有实 ...

随机推荐

  1. zipfile模块

    在python中操作zip文件, 基本上都是使用zipfile模块,他可以创建.解压文件,获取zip文件的元数据信息. 我们想要操作一个zip文件,第一步就是初始化ZipFile实例. 1.打开tes ...

  2. linux MYSQL大小写问题处理

    1)window下默认大小写不敏感,所以在window下.创建表 test后再想创建表TEST会报错.而linux下默认可以.认为是不同的两张表 2)linux创建数据库,安装完毕后 首要任务是在li ...

  3. 安装 nginx

    一.安装准备 首先由于nginx的一些模块依赖一些lib库,所以在安装nginx之前,必须先安装这些lib库,这些依赖库主要有g++.gcc.openssl-devel.pcre-devel和zlib ...

  4. html 自定义属性的获取和应用

    在html 中,我们可以给元素设置自定义属性,格式:  data-属性="属性值",可以设置一个,也可以设置多个 1.获取元素属性的常规方法:直接获取元素,然后使用getAttri ...

  5. ACM__并查集

    并查集是树型的数据结构,处理不想交集合 主要解决查找和合并的问题 步骤: 初始化 把每个点所在的集合初始化为自身 复杂度为O(N) 查找 查找元素所在的集合,即根节点 合并 将两个元素所在的集合合并在 ...

  6. [PHP]自定义session存储机制的两种方案

    ---------------------------------------------------------------------------------------------------- ...

  7. mysql 的REPLAYCE语句

      MySQL数据库insert和update语句引:用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句.言外之意,就是对数 ...

  8. IIS8.0 部署WCF Services

    今天在Win 8的IIS上部署WCF Services,访问SVC文件时出现找不到处理程序的错误,以前遇到这个问题时都是尝试通过注册asp.net的方式处理一下,但是在Win8下这招不灵了,出现如下提 ...

  9. 常用dos命令和windows系统快捷键

    一.dos命令[重难点]1.OS——操作系统2.如何进入dos窗口?——P111 开始——程序——运行——输入cmd3.常用的dos操作命令 3.1 返回上一级 cd.. 3.2 返回到根目录 cd\ ...

  10. css3的2D和3D的转换

    一:2D转换: 通过 CSS3  transform转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 2D移动:translate().使用translate()函数,你可以把元素从原来的位置移 ...