linux多线程学习(三)——线程属性设置
来源:互联网 发布:卡特背扣绝杀猛龙数据 编辑:程序博客网 时间:2024/06/05 17:54
(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。
函数实现:
- #include <stdlib.h>
- #include <stdio.h>
- #include <errno.h>
- #include <pthread.h>
- static void* pthread_func_1 (void*);
- static void* pthread_func_2 (void*);
- int main (int argc, char** argv)
- {
- pthread_t pt_1 = 0;
- pthread_t pt_2 = 0;
- pthread_attr_t attr = {0};
- int ret = 0;
- pthread_attr_init (&attr); //属性设置
- pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL);
- if (ret != 0)
- {
- perror ("pthread_1_create");
- }
- ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL);
- if (ret != 0)
- {
- perror ("pthread_2_create");
- }
- pthread_join (pt_2, NULL);
- return 0;
- }
- static void* pthread_func_1 (void* data)
- {
- int i = 0;
- for (; i < 6; i++)
- {
- printf ("This is pthread_1./n");
- if (i == 2)
- {
- pthread_exit (0);
- }
- }
- return;
- }
- static void* pthread_func_2 (void* data)
- {
- int i = 0;
- for (; i < 3; i ++)
- {
- printf ("This is pthread_2./n");
- }
- return;
- }
从上面事例中,可以得到这么一个结果,就是线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源。在下一篇文章中将介绍线程锁。
- linux多线程学习(三)——线程属性设置。
- linux多线程学习(三)——线程属性设置
- linux多线程学习(三)——线程属性设置
- linux多线程学习(三)——线程属性设置。
- linux多线程学习(三)——线程属性设置。
- linux多线程学习(三)——线程属性设置
- linux多线程学习(三)——线程属性设置
- linux多线程学习(三)——线程属性设置
- linux多线程学习(三)——互斥锁线程控制
- Linux多线程编程之线程属性设置
- Linux多线程实践(三)线程的基本属性设置API
- Linux多线程实践(三)线程的基本属性设置API
- Linux多线程实践(三)线程的基本属性设置API
- Posix多线程笔记(三)—线程属性(1)
- Posix多线程笔记(三)—线程属性(2)
- Posix多线程笔记(三)—线程属性(3)
- linux多线程学习设置线程调度权限
- linux多线程学习设置线程调度权限
- iOS开发之Touch ID指纹验证
- Spring AOP进行日志记录,管理
- python 模块概述
- liunx之echo和unset的用法(centos7)
- 2016年1月10-----------开发WebView+ListView+ScrollView+emoj表情库 有感
- linux多线程学习(三)——线程属性设置
- iOS 谓词
- 关于WebView的第N次开发----血泪史(屎)
- 几种排序算法
- iOS Crash解析
- hive 开发疑问
- 有关夜间模式
- Realm-在iOS中应用-全新的数据库思维模式
- jdk环境变量的配置及path、classpath的作用和区别