Linux多线程实践(3) --线程属性
初始化/销毁线程属性
int pthread_attr_init(pthread_attr_t *attr); int pthread_attr_destroy(pthread_attr_t *attr);
线程分离属性
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
参数说明:
The following values may be specified in detachstate:
PTHREAD_CREATE_DETACHED
Threads that are created using attr will be created in a detached state.
PTHREAD_CREATE_JOINABLE
Threads that are created using attr will be created in a joinable state.
The default setting of the detach state attribute in a newly initialized
threadattributes object is PTHREAD_CREATE_JOINABLE.
The pthread_attr_getdetachstate() returns the detach state attribute of the
threadattributes object attr in the buffer pointed to by detachstate.
线程栈大小
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize); int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
DESCRIPTION
The pthread_attr_setstacksize() function sets the stack size attribute
of the threadattributes object referred to by attr to the value specified
in stacksize.(一般情况下该值我们设置为0,使用系统默认设置的线程栈大小,否则可能会引起程序的可移植性的问题) The stack size attribute determines the minimum size (in bytes) that will
be allocatedfor threads created using the thread attributes object attr.
The pthread_attr_getstacksize() function returns the stack size attribute of
the threadattributes object referred to by attr in the buffer pointed to by stacksize.
线程栈溢出保护区大小
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize); int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
线程竞争范围(进程范围内的竞争 or 系统范围内的竞争)
int pthread_attr_getscope(const pthread_attr_t *attr,int *contentionscope); int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
contentionscope说明:
PTHREAD_SCOPE_SYSTEM
The thread competes for resources with all other threads in all processes on
the system that are in the same scheduling allocation domain (a group of one or more processors).
PTHREAD_SCOPE_SYSTEM threads are scheduled relative to one anotheraccording to their
scheduling policy and priority.
PTHREAD_SCOPE_PROCESS
The thread competes for resources with all other threads in the same process thatwere
also created with the PTHREAD_SCOPE_PROCESS contention scope.
PTHREAD_SCOPE_PROCESS threads are scheduled relative to other threads in the process
according to their scheduling policy and priority. POSIX.1-2001 leaves it unspecified how these threads contend with other threads in other process
on the system or with other threads in the same process that were created with the
PTHREAD_SCOPE_SYSTEM contention scope.
线程调度策略
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy); int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
DESCRIPTION
The pthread_attr_setschedpolicy() function sets the scheduling policy attribute of the thread
attributes object referred to by attr to the value specified in policy. This attribute determines
the scheduling policy of a thread created using the thread attributes object attr.
The supported values for policy are SCHED_FIFO, SCHED_RR, and SCHED_OTHER, as below:
SCHED_FIFO a first-in, first-out policy(先进先出调度策略);
SCHED_RR a round-robin policy(时间片轮转调度算法);
SCHED_OTHER the standard round-robin time-sharing policy(线程一旦开始运行,直到被抢占或者直到线程阻塞或停止为止);
注意:
In order for the policy setting made by pthread_attr_setschedpolicy()
to have effect when calling pthread_create(3), the caller must use pthread_attr_setinheritsched(3)(见下)
to set the inherit-scheduler attribute of the attributes object attr to PTHREAD_EXPLICIT_SCHED(新创建的进程继承自己的调度属性).
线程继承的调度策略
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched); int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
The following values may be specified in inheritsched:
PTHREAD_INHERIT_SCHED(继承调度属性)
Threads that are created using attr inherit scheduling attributes from the
creating thread; the scheduling attributes in attr are ignored.
PTHREAD_EXPLICIT_SCHED(指定自己的调度属性)
Threads that are created using attr take their scheduling attributes from
the values specified by the attributes object.
The default setting of the inherit-scheduler attribute in a newly initialized thread attributes object is PTHREAD_INHERIT_SCHED.
线程调度参数(实际上我们一般只关心一个参数:线程的优先级,默认为0)
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param); int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
//sched_param结构体
struct sched_param {
int sched_priority; /* Scheduling priority */
};
线程的并发级别
int pthread_setconcurrency(int new_level); int pthread_getconcurrency(void);
说明:并发级别仅在N:M线程模型中有效,设置并发级别,给内核一个提示:表示提供给定级别数量的核心线程来映射用户线程是高效的(仅仅是一个提示),默认为0, 内核按照默认的方式进行并发;
/** 查看线程默认属性 **/
void printThreadAttr()
{
pthread_attr_t attr;
pthread_attr_init(&attr);
int detachstate;
pthread_attr_getdetachstate(&attr, &detachstate);
cout << "detach-state: "
<< (detachstate == PTHREAD_CREATE_JOINABLE ?
"PTHREAD_CREATE_JOINABLE" : "PTHREAD_CREATE_DETACHED")
<< endl;
size_t size;
pthread_attr_getstacksize(&attr, &size);
cout << "stack-size: " << size << endl;
pthread_attr_getguardsize(&attr, &size);
cout << "guard-size: " << size << endl;
int scope;
pthread_attr_getscope(&attr, &scope);
cout << "scope: "
<< (scope == PTHREAD_SCOPE_SYSTEM ?
"PTHREAD_SCOPE_SYSTEM" : "PTHREAD_SCOPE_PROCESS")
<< endl;
int policy;
pthread_attr_getschedpolicy(&attr, &policy);
cout << "policy: ";
switch (policy)
{
case SCHED_FIFO:
cout << "SCHED_FIFO";
break;
case SCHED_RR:
cout << "SCHED_RR";
break;
case SCHED_OTHER:
cout << "SCHED_OTHER";
break;
default:
break;
}
cout << endl;
int inheritsched;
pthread_attr_getinheritsched(&attr, &inheritsched);
cout << "inheritsched: "
<< (inheritsched == PTHREAD_INHERIT_SCHED ?
"PTHREAD_INHERIT_SCHED" : "PTHREAD_INHERIT_SCHED")
<< endl;
struct sched_param param;
pthread_attr_getschedparam(&attr, ¶m);
cout << "scheduling priority: " << param.sched_priority << endl;
cout << "concurrency: " << pthread_getconcurrency() << endl;
pthread_attr_destroy(&attr);
}
说明:
绑定属性:
Linux中采用“一对一”的线程机制,也就是一个用户线程对应一个内核线程。绑定属性就是指一个用户线程固定地分配给一个内核线程,因为CPU时间片的调度是面向内核线程(也就是轻量级进程)的,因此具有绑定属性的线程可以保证在需要的时候总有一个内核线程与之对应。而与之对应的非绑定属性就是指用户线程和内核线程的关系不是始终固定的,而是由系统来控制分配的。
分离属性:
分离属性是用来决定一个线程以什么样的方式来终止自己。在非分离情况下,当一个线程结束时,它所占用的系统资源并没有被释放,也就是没有真正的终止。只有当pthread_join()函数返回时,创建的线程才能释放自己占用的系统资源。而在分离属性情况下,一个线程结束时立即释放它所占有的系统资源。这里要注意的一点是,如果设置一个线程的分离属性,而这个线程运行又非常快,那么它很可能在pthread_create()函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用。
Linux多线程实践(3) --线程属性的更多相关文章
- Linux多线程实践(2) --线程基本API
POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以"pthread_"开头,要使用这些函数库,要通过引入头文<pthread.h>,而且链 ...
- Linux多线程实践(1) --线程理论
线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程 VS. 线程 ...
- Linux多线程实践(4) --线程特定数据
线程特定数据 int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); int pthread_key_ ...
- Linux多线程实践(三)线程的基本属性设置API
POSIX 线程库定义了线程属性对象 pthread_attr_t ,它封装了线程的创建者能够訪问和改动的线程属性.主要包含例如以下属性: 1. 作用域(scope) 2. 栈尺寸(stack siz ...
- Linux学习笔记22——线程属性(转)
本文来自博客园:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764204.html 一.线程属性线程具有属性,用pthread_at ...
- Linux c编程:线程属性
前面介绍了pthread_create函数,并且当时的例子中,传入的参数都是空指针,而不是指向pthread_attr_t结构的指针.可以使用pthread_attr_t结构修改线程默认属性,并把这些 ...
- Linux多线程实践(9) --简单线程池的设计与实现
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...
- Linux多线程实践(一)线程基本概念和理论
线程概念 在一个程序里的一个运行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 对于每一个进程至少有一个运行线程; 进程 VS. 线 ...
- Linux多线程实践(四 )线程的特定数据
在单线程程序中.我们常常要用到"全局变量"以实现多个函数间共享数据, 然而在多线程环境下.因为数据空间是共享的.因此全局变量也为全部线程所共同拥有.但有时应用程序设计中有必要提供线 ...
随机推荐
- Day 1 Python简单程序
一.高级语言和低级语言 最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需翻译,从纸带打孔输入即可执行得到结果.后来为了方便记忆,就将用0.1序列表示的机器指令都用符号助记 ...
- C# 制作屏保(图片位置随机变化)
最近无所事事,闲着无聊,在网上翻看资料时碰巧看到了屏保制作,根据大神的思路也理解到屏保也不是很难.因此根据我自己的理解,动手谢了一个屏保. 首先,打开VS2010创建一个Windows窗体应用程序,名 ...
- Python学习---字符串处理
This world is but a canvas to our imagination. 世界只是我们的想象的画布. ----Apri 22 ''' 题目内容: "Pig Latin&q ...
- centos gnome面板菜单任务栏消失后的解决
今天终于下决心把我的电脑装成了centos,上网的时候感觉上边的那一行菜单栏碍事儿,就把他给删了 就是桌面最顶上这一行东西,然后百度无果,谷歌上不去,用bing好不容易才找到里解决方案! 症状:进入l ...
- 酷伯伯实时免费HTTP代理ip爬取(端口图片显示+document.write)
分析 打开页面http://www.coobobo.com/free-http-proxy/,端口数字一看就不对劲,老规律ctrl+shift+c选一下: 这就很悲剧了,端口数字都是用图片显示的: 不 ...
- ACM 饭卡
Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负) ...
- 状态模式、职责链模式——省去if-else的繁琐结构
小时候写日记都是这么写的:上午七点起床,八点之前洗脸刷牙吃早饭,十二点之前好好上课,中午一点,吃午饭,下午两点到六点,上课,下课,找请假,明天妈妈要带我去姥姥家,九点之前,看动画片,九点钟,收拾去姥姥 ...
- android混淆那些坑
ProGuard简介 在最新的Android Studio 2.2.2版本创建的Android工程中,module中的build.gradle有如下一段配置.这里的minifyEnabled即用来控制 ...
- Python 妙用heapq
小顶堆求TopK大 大顶堆求BtmK小 题外话 Python有一个内置的模块,heapq标准的封装了最小堆的算法实现.下面看两个不错的应用. 小顶堆(求TopK大) 话说需求是这样的: 定长的序列,求 ...
- Redis工作系列之一 与 Memcached对比理解
近期公司项目在使用Redis,这几年Redis很火,Redis也常常被当作Memcached的挑战者被提到桌面上来.关于Redis与Memcached的比较更是比比皆是.然而,Redis真的 ...