【Linux 线程】常用线程函数复习《四》
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 线程】常用线程函数复习《四》的更多相关文章
- 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 ...
- Linux中常用的函数
1.devm_kzalloc() 函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数,但是devm_kzalloc()是跟设备(device)有关的,当设备(device ...
- Linux 系统常用命令汇总(三) 用户和用户组管理
用户和用户组管理 命令 选项 注解 示例 useradd [选项] 用户名 新建用户 创建一个名为tester的用户,并指定他的UID为555,指定加入test群,指定其使用C-shell: use ...
- Linux最常用的基本操作复习
.ctrl + shift + = 放大终端字体 .ctrl + - 缩小终端字体 .ls 查看当前文件夹下的内容 .pwd 查看当前所在的文件夹 .cd 目录名 切换文件夹 .touch 如果文件不 ...
- Linux:结束线程的三种方式
一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止.但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态. ...
- Linux可重入函数和线程安全的区别与联系(转)
*****可重入函数 函数被不同的控制流程调用,有可能在第一次调用还没返回时就再次进入该函数,这称为重入. 当程序运行到某一个函数的时候,可能因为硬件中断或者异常而使得在用户正在执行的代码暂时终端转而 ...
- Linux下通用线程池的创建与使用
线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...
- linux系统编程--线程
安装线程man page,命令:sudo apt-get install manpages-posix-dev 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本 ...
- Linux进程间通信与线程间同步详解(全面详细)
引用:http://community.csdn.net/Expert/TopicView3.asp?id=4374496linux下进程间通信的几种主要手段简介: 1. 管道(Pipe)及有名管道( ...
- Linux平台下线程池的原理及实现
转自:http://blog.csdn.net/lmh12506/article/details/7753952 前段时间在github上开了个库,准备实现自己的线程池的,因为换工作的事,一直也没有实 ...
随机推荐
- while 循环居然可以用else
while 循环居然可以用else python 3 while a<50: print a a=a+1 else: print"over."
- 在升级过内核的机器上安装docker遇到的一个错误
出现了以下错误: [root@osd2 ~]# service docker start Starting cgconfig service: Error: cannot mount memory t ...
- linux thread_info 与thread_struct
有个同事看3.10代码中,看着两个结构,会混淆,所以我简单答复了一下. thread_info是和内核栈放一块的,网上到处都是thread_info的资料,但thread_struct的资料比较少,在 ...
- Linux find命令使用方法
Linux中find命令用来在指定目录下查找文件.通过组合不同参数可以在linux系统中快速查找需要的文件或目录. find命令语法 格式:find pathname -options [ -pr ...
- 记录在Centos下安装和使用Git的过程,从github上克隆仓库和提交。
1 安装git yum install git 2配置DNS vi /etc/resolv.conf nameserver 8.8.8.8nameserver 8.8.4.4 3 设置网关 vi /e ...
- java Overloaded的方法是否可以改变返回值的类型?
刚才看到这样一个题,下面的解释很乱,所以还是做一下试验比较好 public class Test { public static void main(String[] args){ Bae b = n ...
- repo 原理
Android源代码工程用repo来进行管理,本质是多个git仓的整合. 感谢https://blog.csdn.net/stoic163/article/details/78790349 1.Gen ...
- 安装opencv3.x卡在ICV: Downloading ippicv_linux_20151201.tgz...
参考:http://blog.csdn.net/bobsweetie/article/details/52502741 可以自己下载: ICV: Downloading ippicv_linux_20 ...
- jdk 11特性
JDK 11 总共包含 17 个新的 JEP ,分别为: 181: Nest-Based Access Control(基于嵌套的访问控制) 309: Dynamic Class-File Const ...
- div下面多个a标签的点击事件,并且获取a的属性
$('.fensiselect').on('click','a',function(){ var id= $(this).attr('fanid'); alert(id) })