linux多线程学习(三)——线程属性设置。

简介:

在上一篇文章中,介绍了线程的创建和退出,以及相关函数的使用。其中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:firstline[0]] view plaincopy
  1. #include <stdlib.h>    
  2. #include <stdio.h>    
  3. #include <errno.h>    
  4. #include <pthread.h>    
  5.     
  6. static void* pthread_func_1 (void*);    
  7. static void* pthread_func_2 (void*);    
  8.     
  9. int main (int argc, char** argv)    
  10. {    
  11.   pthread_t pt_1 = 0;    
  12.   pthread_t pt_2 = 0;    
  13.   pthread_attr_t attr = {0};    
  14.   int ret = 0;    
  15.     
  16.   pthread_attr_init (&attr); //属性设置  
  17.   pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);    
  18.   pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);    
  19.       
  20.   ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);    
  21.   if (ret != 0)    
  22.   {    
  23.     perror ("pthread_1_create");    
  24.   }    
  25.       
  26.   ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);    
  27.   if (ret != 0)    
  28.   {    
  29.     perror ("pthread_2_create");    
  30.   }    
  31.     
  32.   pthread_join (pt_2, NULL);    
  33.     
  34.   return 0;    
  35. }    
  36.     
  37. static void* pthread_func_1 (void* data)    
  38. {    
  39.   int i = 0;    
  40.       
  41.   for (; i < 6; i++)    
  42.   {     
  43.     printf ("This is pthread_1./n");    
  44.        
  45.     if (i == 2)    
  46.     {    
  47.       pthread_exit (0);    
  48.     }    
  49.   }    
  50.     
  51.   return;    
  52. }    
  53.     
  54. static void* pthread_func_2 (void* data)    
  55. {    
  56.   int i = 0;    
  57.     
  58.   for (; i < 3; i ++)    
  59.   {    
  60.     printf ("This is pthread_2./n");    
  61.   }    
  62.     
  63.   return;    
  64. }    

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

 

~~END~~

相关文章
|
10月前
|
Kubernetes Linux Go
使用 Uber automaxprocs 正确设置 Go 程序线程数
`automaxprocs` 包就是专门用来解决此问题的,并且用法非常简单,只需要使用匿名导入的方式 `import _ "go.uber.org/automaxprocs"` 一行代码即可搞定。
432 78
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
794 2
|
存储 安全 Linux
|
存储 IDE Linux
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
本文详细介绍了在VMware虚拟机中安装CentOS 6.8的全过程。首先,需确保已安装VMware并开启V-CPU虚拟化功能,可通过BIOS设置或使用LeoMoon CPU-V工具检测。接着,下载CentOS镜像文件,并在VMware中新建虚拟机,配置CPU、内存、硬盘等参数。最后,加载ISO镜像启动虚拟机,按照提示完成CentOS的安装,包括语言、键盘、存储方式、地区、密码设置及硬盘分区等步骤。安装完成后,以root用户登录即可进入系统桌面,开始学习Linux命令和操作。
1188 12
零基础保姆级教程!手把手教你免费玩转Linux CentOS安装+学习环境搭建(附避坑指南)
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
320 10
|
监控 Java
线程池大小如何设置
在并发编程中,线程池是一个非常重要的组件,它不仅能够提高程序的响应速度,还能有效地利用系统资源。合理设置线程池的大小对于优化系统性能至关重要。本文将探讨如何根据应用场景和系统资源来设置线程池的大小。
|
6月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
728 1
二、Linux文本处理与文件操作核心命令
|
6月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
431 137
|
6月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1115 58
|
5月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1019 2

热门文章

最新文章