线程属性总结

今天面试那哥们问起线程属性,me竟然就说出了一个,囧

学习:http://blog.csdn.net/zsf8701/article/details/7842392

http://blog.csdn.net/jxhnuaa/article/details/3254299

http://blog.sina.com.cn/s/blog_9bd573450101hgdr.html

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

在线程建立时,第二参数是设置线程的属性,当为NULL时,设置成系统默认属性:非邦定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。

/usr/include/pthread.h 包含 bits/pthreadtypes.h

union pthread_attr_t
{
  char __size[__SIZEOF_PTHREAD_ATTR_T];
  long int __align;
};

typedef union pthread_attr_t pthread_attr_t;

typedef struct
{
   int                  detachstate;     线程的分离状态
   int                  schedpolicy;   	线程调度策略
   struct sched_param   schedparam;   	线程的调度参数
   int                  inheritsched;    线程的继承性
   int                  scope;          线程的作用域
   size_t               guardsize; 		线程栈末尾的警戒缓冲区大小
   int                  stackaddr_set;
   void *               stackaddr;      线程栈的位置
   size_t               stacksize;      线程栈的大小
}pthread_attr_t;

从上面的结构可以看到线程都有些什么属性,下面一些函数来设置线程属性:

       #include <pthread.h>

       int pthread_attr_init(pthread_attr_t *attr);
       int pthread_attr_destroy(pthread_attr_t *attr);

功能:initialize and destroy thread attributes object.

Calling pthread_attr_init() on a thread attributes object that has already been initialized results in undefined behavior.

When  a  thread  attributes  object is no longer required, it should be destroyed using the pthread_attr_destroy() function.  Destroying a thread attributes

object has no effect on threads that were created using that object.

On success, these functions return 0; on error, they return a nonzero error number.

       #include <pthread.h>

       int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
       int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);

功能:set/get detach state attribute in thread attributes object.

线程的分离状态决定一个线程以什么样的方式来终止自己

PTHREAD_CREATE_DETACHED

分离线程没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。应该根据自己的需要,选择适当的分离状态

PTHREAD _CREATE_JOINABLE

线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。

如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是可以在被创建的线程里调用pthread_cond_timewait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里常用的方法。但是注意不要使用诸如wait()之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。

       #include <pthread.h>

       int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
       int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);

功能:set/get scheduling policy attribute in thread attributes object

POSIX标准指定了三种调度策略:先入先出策略 (SCHED_FIFO)、循环策略 (SCHED_RR) 和自定义策略 (SCHED_OTHER)。SCHED_FIFO 是基于队列的调度程序,对于每个优先级都会使用不同的队列。SCHED_RR 与 FIFO 相似,不同的是前者的每个线程都有一个执行时间配额。SCHED_FIFO 和 SCHED_RR 是对 POSIX Realtime 的扩展。SCHED_OTHER 是缺省的调度策略。

新线程默认使用 SCHED_OTHER 调度策略。线程一旦开始运行,直到被抢占或者直到线程阻塞或停止为止。

SCHED_FIFO

如果调用进程具有有效的用户 ID 0,则争用范围为系统 (PTHREAD_SCOPE_SYSTEM) 的先入先出线程属于实时 (RT) 调度类。如果这些线程未被优先级更高的线程抢占,则会继续处理该线程,直到该线程放弃或阻塞为止。对于具有进程争用范围 (PTHREAD_SCOPE_PROCESS)) 的线程或其调用进程没有有效用户 ID 0 的线程,请使用 SCHED_FIFO,SCHED_FIFO 基于 TS 调度类。

SCHED_RR

如果调用进程具有有效的用户 ID 0,则争用范围为系统 (PTHREAD_SCOPE_SYSTEM)) 的循环线程属于实时 (RT) 调度类。如果这些线程未被优先级更高的线程抢占,并且这些线程没有放弃或阻塞,则在系统确定的时间段内将一直执行这些线程。对于具有进程争用范围 (PTHREAD_SCOPE_PROCESS) 的线程,请使用 SCHED_RR(基于 TS 调度类)。此外,这些线程的调用进程没有有效的用户 ID 0。

       #include <pthread.h>

       int pthread_attr_setschedparam(pthread_attr_t *attr,
                                      const struct sched_param *param);
       int pthread_attr_getschedparam(pthread_attr_t *attr,
                                      struct sched_param *param);

功能:set/get scheduling parameter attributes in thread attributes object

           struct sched_param {
               int sched_priority;     /* Scheduling priority */
           };
       #include <pthread.h>

       int pthread_attr_setinheritsched(pthread_attr_t *attr,
                                        int inheritsched);
       int pthread_attr_getinheritsched(pthread_attr_t *attr,
                                        int *inheritsched);

功能:set/get inherit scheduler attribute in thread attributes object

PTHREAD_EXPLICIT_SCHED

PTHREAD_INHERIT_SCHED

前者表示使用结构pthread_attr_t指定的调度算法,后者表示继承父线程使用的调度算法,默认为前者

       #include <pthread.h>

       int pthread_attr_setscope(pthread_attr_t *attr, int scope);
       int pthread_attr_getscope(pthread_attr_t *attr, int *scope);

功能:设置线程作用域

PTHREAD_SCOPE_SYSTEM

PTHREAD_SCOPE_PROCESS

前者表示在整个系统内竞争CPU资源,后者表示在同一进程内竞争CPU资源,默认为前者

       #include <pthread.h>

       int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
       int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);

功能: set/get guard size attribute in thread attributes object

在线程栈顶留出一段空间,防止栈溢出。

当栈指针进入这段保护区时,系统会发出错误,通常是发送信号给线程。

该属性默认值是PAGESIZE大小,该属性被设置时,系统会自动将该属性大小补齐为页大小的整数倍。

当改变栈地址属性时,栈保护区大小通常清零。

       #include <pthread.h>

       int pthread_attr_setstack(pthread_attr_t *attr,
                                 void *stackaddr, size_t stacksize);
       int pthread_attr_getstack(pthread_attr_t *attr,
                                 void **stackaddr, size_t *stacksize);

功能:获取/设置线程栈及其大小

stackaddr  should  point  to the lowest addressable byte of a buffer of stacksize bytes that was allocated by the caller.  The pages of the allocated buffer should be both readable and writable.

	#include <pthread.h>

	int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
	int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);

	#include <pthread.h>

	int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
	int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);

实例见:man pthread_attr_init

线程属性总结

时间: 2024-10-08 13:45:34

线程属性总结的相关文章

QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化

元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数,多重祖先元类,method, property, Enumerator, Signal, Slot等等 http://doc.qt.io/qt-5/qobject.html http://doc.qt.io/qt-5/qmetaobject.html 我感觉Qt的出现,除了提供GUI以外,主要就是提

Java 并发 线程属性

Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线程A里,创建另一个线程B的时候,那么A是父线程,B是子线程.当在一个运行的线程A里,创建线程B,然后又创建了线程C,这时候虽然B比C创建早,可是B并不是C的父线程,而A是B和C的父线程. 3.线程的优先级高度依赖于系统,当虚拟机依赖于宿主机平台的线程实现机制时,Java线程的优先级被映射到宿主机平台

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 de

UNIX环境编程学习笔记(27)——多线程编程(二):控制线程属性

lienhua342014-11-09 1 线程属性概括 POSIX 线程的主要属性包括 scope 属性.detach 属性.堆栈地址.堆栈大小.优先级.在头文件 pthread.h 中定义了结构体pthread_attr_t 来记录线程的属性. 在创建线程的函数pthread_create 的第二个参数 attr 就是一个pthread_attr_t结构体的指针,通过该参数,我们可以控制新创建的线程的属性.如果 atrr参数为 NULL,表示创建一个默认属性的新线程. pthread_att

线程属性

线程属性 一.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化.我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化. 名称:: pthread_attr_init/pthread_attr_destroy 功能: 对线程属性初始化/去除初始化 头文件: #include <pthread.h> 函数原形: int pthread_attr_init(pthr

pthread_attr_t 线程属性(二)

一.函数: 1.线程属性的初始化与销毁:#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t   *attr);Both return: 0 if OK, error number on failure2.设置线程属性--detackstate(分离状态):#include <pthread.h>int pthread_attr_

pthread_attr_init线程属性

1.线程属性 线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化.我们用pthread_attr_init函数对其初始化,用pthread_attr_destroy对其去除初始化. 1. 名称:: pthread_attr_init/pthread_attr_destroy 功能: 对线程属性初始化/去除初始化 头文件: #include<pthread.h> 函数原形: int pthread_attr_init(pthread

线程属性总结 线程的api属性

http://blog.csdn.net/zsf8701/article/details/7842392 //线程属性结构如下:typedef struct{ int etachstate; //线程的分离状态 int schedpolicy; //线程调度策略 structsched_param schedparam; //线程的调度参数 int inheritsched; //线程的继承性 int scope; //线程的作用域 size_t guardsize; //线程栈末尾的警戒缓冲区

第10章 线程控制(2)_线程属性和线程优先级

3. 线程属性 3.1 线程属性结构体 (1)pthread_attr_t结构体 (2)线程属性初始化和销毁 头文件 #include <pthread.h> 函数 int pthread_attr _init(pthread_attr_t* attr); //初始化 int pthread_attr_destroy(pthread_attr_t* attr); //销毁 返回值 成功返回0,否则返回错误编号 3.2 设置和获取分离属性 头文件 #include <pthread.h&g

12.3 线程属性

pthread接口允许我们通过设置与不同对象相关联的属性来微调线程以及同步对象的行为.通常来说,管理这些属性的函数符合如下模式: 每一个对象都有与其相关联的属性对象类型(线程由线程属性,互斥锁由互斥锁属性,等等),一个属性对象可以表示多个属性.属性对象对于应用程序来说是不透明的,也就是说应用程序并支持获取属性对象内部结构,这能够促进应用程序的移植.取而代之的是,应用程序需要使用函数来对这些属性进行管理. 一个初始化函数用于设置属性对象默认值; 另一个函数用于释放属性对象.如果初始化函数为属性对象