在上一篇文章中,介绍了线程的创建和退出,以及相关函数的使用。其中pthread_create函数的第二个参数,是关于线程属性的设置,这也是今天所有讲述的。这些属性主要包括邦定属性、分离属性、堆栈地址、堆栈大小、优先级。其中系统默认的是非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。

(1)邦定属性。

在LINUX中,采用的是“一对一”的线程机制。也就是一个用户线程对应一个内核线程。邦定属性就是指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程(轻量级进程)的,因此具有邦定属性的线程可以保证在需要的时候总有一个内核线程与之对应,而与之对应的非邦定属性就是指用户线程和内核线程的关系不是始终固定的,而是由系统来分配。

(2)分离属性。

分离属性是决定以一个什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它多占用的线程没有得到释放,也就是没有真正的终止,需要通过pthread_join来释放资源。而在分离属性情况下,一个线程结束时会立即释放它所占有的系统资源。但这里有一点要注意的是,如果设置一个线程分离属性,而这个线程又运行得非常快的话,那么它很可能在pthread_create函数返回之前就终止了线程函数的运行,它终止以后就很有可能将线程号和系统资源移交给其他的线程使用,这时调用pthread_create的线程就得到错误的线程号。

这些属性都是通过一些函数来完成的,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。

1、pthread_attr_init

功能:        对线程属性变量的初始化。

头文件:     <pthread.h>

函数原型:   int pthread_attr_init (pthread_attr_t* attr);

函数传入值:attr:线程属性。

函数返回值:成功: 0

失败: -1

2、pthread_attr_setscope

功能:        设置线程绑定属性。

头文件:     <pthread.h>

函数原型:   int pthread_attr_setscope (pthread_attr_t* attr, int scope);

函数传入值:attr: 线程属性。

scope:PTHREAD_SCOPE_SYSTEM(绑定)

PTHREAD_SCOPE_PROCESS(非绑定)

函数返回值得:同1。

3、pthread_attr_setdetachstate

功能:        设置线程分离属性。

头文件:      <phread.h>

函数原型:    int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);

函数传入值:attr:线程属性。

detachstate:PTHREAD_CREATE_DETACHED(分离)

PTHREAD_CREATE_JOINABLE(非分离)

函数返回值得:同1。

4、pthread_attr_getschedparam

功能:       得到线程优先级。

头文件:    <pthread.h>

函数原型:  int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);

函数传入值:attr:线程属性;

param:线程优先级;

函数返回值:同1。

5、pthread_attr_setschedparam

功能:       设置线程优先级。

头文件:     <pthread.h>

函数原型:   int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);

函数传入值:attr:线程属性。

param:线程优先级。

函数返回值:同1。

函数实现:

[cpp] view plaincopy
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <errno.h>
  4. #include <pthread.h>
  5. static void* pthread_func_1 (void*);
  6. static void* pthread_func_2 (void*);
  7. int main (int argc, char** argv)
  8. {
  9. pthread_t pt_1 = 0;
  10. pthread_t pt_2 = 0;
  11. pthread_attr_t attr = {0};
  12. int ret = 0;
  13. pthread_attr_init (&attr); //属性设置
  14. pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
  15. pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
  16. ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);
  17. if (ret != 0)
  18. {
  19. perror ("pthread_1_create");
  20. }
  21. ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);
  22. if (ret != 0)
  23. {
  24. perror ("pthread_2_create");
  25. }
  26. pthread_join (pt_2, NULL);
  27. return 0;
  28. }
  29. static void* pthread_func_1 (void* data)
  30. {
  31. int i = 0;
  32. for (; i < 6; i++)
  33. {
  34. printf ("This is pthread_1./n");
  35. if (i == 2)
  36. {
  37. pthread_exit (0);
  38. }
  39. }
  40. return;
  41. }
  42. static void* pthread_func_2 (void* data)
  43. {
  44. int i = 0;
  45. for (; i < 3; i ++)
  46. {
  47. printf ("This is pthread_2./n");
  48. }
  49. return;
  50. }

从上面事例中,可以得到这么一个结果,就是线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源。在下一篇文章中将介绍线程锁。

linux多线程学习(三)——线程属性设置相关推荐

  1. linux多线程学习(二)——线程的创建和退出

    在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的.学习它.掌握它.吃透它是作为一个程序员的必须作为.在接下来的讲述中,所有线程的操作都是用户级的操作.在LINUX ...

  2. Linux多线程实践(3) --线程属性

    初始化/销毁线程属性 int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *att ...

  3. C#多线程学习(三) 生产者和消费者

    C#多线程学习(三) 生产者和消费者 原文链接:http://kb.cnblogs.com/page/42530/ 本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操 ...

  4. C#多线程学习(三) 生产者和消费者 (转载系列)——继续搜索引擎研究

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  5. Linux多线程实践(1) --线程理论

    线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  ...

  6. Linux多线程实践(2) --线程基本API

    POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以"pthread_"开头,要使用这些函数库,要通过引入头文<pthread.h>,而且链 ...

  7. css使用三个属性设置文本结尾省略号显示

    三个css属性设置文本内容超出部分,省略号显示 文章目录 前言 一.三个属性 二.属性使用 三.使用 总结 前言 本篇文章主要记录了css样式设置文本超出部分省略号显示,适用于input标签和普通标签 ...

  8. Java多线程学习笔记-线程的使用

    Java中创建多线程的三种方法 1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程 ------------------------- ...

  9. Linux内核学习(三)之asm.s和trap.c的关联!

    前言: 大家好,今天给大家解析一下Linux中断处理流程里面asm.s和trap.c里面源码,对于Linux中断工作流程不清楚的朋友,可以看上篇文章,这里再提示一下asm.s和trap.c的源码目录: ...

最新文章

  1. 设计模式之装饰模式(Decorator)摘录
  2. ES6 module 简单整理
  3. 其实不的免费图标网站
  4. P4915 帕秋莉的魔导书
  5. Android开发常用工具类
  6. 吓尿了!手机充完电不拔充电器后果这么严重
  7. nginx php value,PHP+NGINX参数优化
  8. gcc编译的几个重要参数
  9. Linux命令解释之groupadd,groupdel,groupmod,groupmems
  10. Spring Cloud整合Seata实现2PC二阶段分布式事务
  11. 正确获取CleanMyMac注册码并激活
  12. 贝叶斯公式求解公园凉鞋问题
  13. 用js计时器写倒计时
  14. ICPCCamp 2016 Day 6 - Spb SU and Spb AU Contest(Colored path-dp)
  15. 【华为OD统一考试B卷 | 100分】按身高和体重排队(C++ Java JavaScript Python)
  16. 【2023王道数据结构】【字符串匹配算法】字符串的KMP(next数组)模式匹配算法C、C++完整实现(可直接运行)
  17. scrum立会报告+燃尽图(第二周第六次)
  18. 清理yarn、npm缓存包
  19. Jvm sandbox mock机制实践
  20. putty 报错no supported authentication methods available (server sent:publickey...)

热门文章

  1. tigervnc远程控制linux,CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面(示例代码)
  2. python图片转base64编码,与base64编码转图片
  3. 解决使用sudo没问题,但是使用su会报错 su: Authentication failure 的问题
  4. gentry同态加密算法_基于Gentry全同态加密算法公钥个数优化的研究
  5. python 颜色_Python可视化|matplotlib07自带颜色条Colormap(三)
  6. java 线程死锁简单例子_java 多线程死锁详解及简单实例
  7. AJAX方式进行验证码的判断(JS方式)
  8. HITOJ 2662 Pieces Assignment(状压DP)
  9. eclispe---快捷键设置
  10. UVA5876 Writings on the Wall 扩展KMP