一、pthread
1.int pthread_create (pthread_t *pThread, const pthread_attr_t *pAttr, void * (*start_routine)(void *),void *arg);
函数说明:创建一个线程;
参数说明:参数一:线程id,创建线程时,为每一个线程分配一个Id。
参数二:线程属性,后面详细介绍线程属性。
参数三:线程函数,注意该函数返回值必须为void* 且参数同样也只能是
void*。
参数四:传递给线程函数的参数。
2.void pthread_exit(void *value_ptr);
函数说明:终止本线程(线程的退出可以是隐士退出也可以显示退出调用pthread_exit
函数)
参数说明:如果该参数value_ptr不为NULL,那么,此线程调用pthread_exit函数终止时
函数说明:该函数功能有两个,一:等待指定的tid线程结束,将返回值存在value_ptr里
二:该函数会释放被等待线程所占用的资源。
参数说明:参数一:等待线程的id
pthread_exit 结束线程并设置线程的返回值,用pthread_join来获取线程结束时的返回
值。
3.int pthread_detach(pthread_t thread);
函数说明:分离一个线程,将该线程分离后,此线程结束后,会自动释放其所占资源。
一般来说,如果没有用pthread_detach分离的线程,都会使用ptread_join来回收其线程
所占资源
参数说明:分离某个线程的tid;
4.pthread_t pthread_self(void);
函数说明:获取本线程的tid(线程id),经常作为pthread_detach的参数
5.int pthread_key_create(pthread_key_t *key,void(*destructor)(void*));
函数说明:创建线程的私有变量,大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。
参数说明:参数一:创建的私有变量
参数二:在线程结束退出后,调用该函数清理线程私有变量(即线程存储)
int pthread_setspecific(pthread_key_t key, const void *value);
函数说明:设置key(关键字)所关联的私有地址
参数说明:参数一:所要设置的关键字
参数二:key所要代表的那个地址
之后key的值就是关联的地址
void *pthread_getspecific(pthread_key_t key);
函数说明:该函数就是用来获取本线程私有变量key所关联的地址,之后可以转型使用
参数说明:pthread_key_create创建的线程私有变量
int pthread_key_delete(pthread_key_t key);
函数说明:删除键所占的内存;
例如:
/*三个线程:主线程,th1,th2各自有自己的私有数据区域
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
static pthread_key_t str_key;
//define a static variable that only be allocated once
static pthread_once_t str_alloc_key_once=PTHREAD_ONCE_INIT;
static void str_alloc_key();
static void str_alloc_destroy_accu(void* accu);
char* str_accumulate(const char* s)
{ char* accu;
pthread_once(&str_alloc_key_once,str_alloc_key);//str_alloc_key()这个函数只调用一次
accu=(char*)pthread_getspecific(str_key);//取得该线程对应的关键字所关联的私有数据空间首址
if(accu==NULL)//每个新刚创建的线程这个值一定是NULL(没有指向任何已分配的数据空间)
{ accu=malloc(1024);//用上面取得的值指向新分配的空间
if(accu==NULL) return NULL;
accu[0]=0;//为后面strcat()作准备
pthread_setspecific(str_key,(void*)accu);//设置该线程对应的关键字关联的私有数据空间
printf("Thread %lx: allocating buffer at %p\n",pthread_self(),accu);
}
strcat(accu,s);
return accu;
}
//设置私有数据空间的释放内存函数
static void str_alloc_key()
{ pthread_key_create(&str_key,str_alloc_destroy_accu);/*创建关键字及其对应的内存释放函数,当进程创建关键字后,这个关键字是NULL。之后每创建一个线程os都会分给一个对应的关键字,关键字关联线程私有数据空间首址,初始化时是NULL*/
printf("Thread %lx: allocated key %d\n",pthread_self(),str_key);
}
/*线程退出时释放私有数据空间,注意主线程必须调用pthread_exit()(调用exit()不行)才能执行该函数释放accu指向的空间*/
static void str_alloc_destroy_accu(void* accu)
{ printf("Thread %lx: freeing buffer at %p\n",pthread_self(),accu);
free(accu);
}
//线程入口函数
void* process(void *arg)
{ char* res;
res=str_accumulate("Resule of ");
if(strcmp((char*)arg,"first")==0)
sleep(3);
res=str_accumulate((char*)arg);
res=str_accumulate(" thread");
printf("Thread %lx: \"%s\"\n",pthread_self(),res);
return NULL;
}
//主线程函数
int main(int argc,char* argv[])
{ char* res;
pthread_t th1,th2;
res=str_accumulate("Result of ");
pthread_create(&th1,NULL,process,(void*)"first");
pthread_create(&th2,NULL,process,(void*)"second");
res=str_accumulate("initial thread");
printf("Thread %lx: \"%s\"\n",pthread_self(),res);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
pthread_key_delete(str_key); //释放key的内存
pthread_exit(0);
}
6.int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
函数说明:一次执行函数,用来在多线程中,表示某个方法只会执行一次。(即在一个进
程里,参数二所指向的函数只会执行一次)
参数说明:参数一:表示一次性初始化,通常pthread_once_t
once_control=PTHREAD_ONCE_INIT来初始化;
参数二:指向某个函数
7.int pthread_cancel(pthread_t thread);
函数说明:该函数向指定的线程发送信号用来请求结束它,注意:只是请求;该线程也可以不结束,后
面会介绍。
参数说明:请求要结束线程的id;
8.int pthread_setcancelstate(int state, int *oldstate);
函数说明:函数用来设置本线程对pthread_cancel函数发送信号的反应;
参数说明:参数一:state有两种状态,PTHREAD_CANCEL_ENABLE(缺省)和
PTHREAD_CANCEL_DISABLE分别表示,忽略此信号(也就是用pthraed_cancel不能结束本线
程)和信号继续运行(可以结束本线程)
9.int pthread_setcanceltype(int type, int *oldtype);
函数说明:设置用pthread_cancel请求结束线程时,是立即结束还是延迟结束(取消点退
出)
参数说明:参数一:有两种取值PTHREAD_CANCEL_DEFFERED和
PTHREAD_CANCEL_ASYCHRONOUS分别表示取消点退出和立即退出
前提:在pthread_setcancelstate设置成ENABLE有效。
参数二:如果不为NULL,用来获取之前的取消类型值。
10.void pthread_testcancel(void);
函数说明:设置取消点。当然,除了pthread_testcancel设置的取消点外还有其他默认的
取消点;
11.void pthread_cleanup_push(void (*routine)(void *), void *arg);
void pthread_cleanup_pop(int execute);
注意:这两个函数要在同一个模块里(即{}),不能分开。
函数说明:这组函数叫线程清理函数,当线程结束时会调用线程清理函数routine所指向
的函数。
1)当函数 pthread_cleanup_pop(1)参数为非0时
本线程调用pthread_exit()时和其他线程调用pthread_cancel()和执行到
pthread_cleanup_pop函数时,会调用清理函数
2) 当函数 pthread_cleanup_pop(0)参数为0时
本线程调用pthread_exit()时和其他线程调用pthread_cancel(),会调用清理函数
二、线程属性介绍
typedef struct {
int threadAttrStatus; /* status flag */
size_t threadAttrStacksize; /* stack size */
void * threadAttrStackaddr; /* stack address */
size_t threadAttrGuardsize; /* guard address (RTP only)线
程栈末尾的警戒缓冲区大小 */
int threadAttrDetachstate; /* detach state 分离状态 */
int threadAttrContentionscope; /* contention scope 表线程竞
争CPU范围 */
int threadAttrInheritsched; /* inherit scheduler 继承性 */
int threadAttrSchedpolicy; /* scheduling policy 调度策
略 */
struct _Sched_param threadAttrSchedparam; /* sched param struct 调度参
数*/
} pthread_attr_t;
struct _Sched_param
{
int sched_priority; /* scheduling priority 表示线程的优先级 */
}
1.int pthread_attr_init(pthread_attr_t *attr);
函数说明:线程属性的初始化
参数说明:线程属性结构体指针,表示要设置的线程属性
2.int pthread_attr_destroy(pthread_attr_t *attr);
函数说明:销毁线程属性,使它恢复在调用pthread_attr_init以前;
参数说明:线程属性结构体指针,表示要设置的线程属性
3.int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
函数说明:设置线程属性栈的大小
参数说明: 参数一:线程属性结构体指针,表示要设置的线程属性
参数二:设置大小的值
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
函数说明:用来获取指定线程属性所设置的栈的大小
4.int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
函数说明:设置线程属性栈的地址
参数说明: 参数一:线程属性结构体指针,表示要设置的线程属性
参数二:所设置的地址(即stackaddr指向的地址)
int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);
函数说明:用来获取指定线程属性所设置的栈地址
5.int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
函数说明:设置线程属性的分离状态,分离线程,在该线程结束退出后会自动清理所占资
源;非分离线程则需要调用pthread_join来回收资源。
参数说明:参数一:线程属性结构体指针,表示要设置的线程属性
参数二:有两个值PTHREAD_CREATE_DETACHED(分离线程)
PTHREAD_CREATE_JOINABLE(非分离线程)
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
函数说明:获取线程属性的分离状态
6.int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
函数说明:设置线程竞争CPU的范围
参数说明:参数一:线程属性结构体指针,表示要设置的线程属性
参数二:有两个值PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。
int pthread_attr_getscope(const pthread_attr_t *attr, int *contentionscope);
函数说明;获取指定线程属性的线程竞争范围情况
7.int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
函数说明:用来设置线程的继承性。要么是从创建它的线程里继承调度属性(调度策略、
调度参数),要么是从线程属性里通过pthread_attr_setschedpolicy和
pthread_attr_setschedparam里获得调度属性。
参数说明:参数一:线程属性结构体指针,表示要设置的线程属性
参数二:有两个值选择,PTHREAD_INHERIT_SCHED: 新的线程调度策略和参数
继承于创建它的线程;
PTHREAD_EXPLICIT_SCHED:新的线程继承策略和参数来自于
schedpolicy和schedparam属性中显式设置的调度信息!
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
函数说明:获取线程属性继承性
注: 继承性决定调度的参数是从创建它的进程中继承还是使用在
schedpolicy和schedparam属性中显式设置的调度信息。
8.int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
函数说明:设置线程调用策略
参数说明:参数一:线程属性变量
参数二:设置的策略,有三个值选择:
SCHED_FIFO :先进先出
SCHED_RR :轮转法
SCHED_OTHER :其他方法
SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR
支持优先级的使用,他们分别为1和99,数值越大优先级越高.
注意:
> 此处的SCHED_FIFO是允许被高优先级抢占的!
> 也就是有高优先级的必须先运行
> SCHED_RR是设置一个时间片
> 当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量
上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤
醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先
织的SCHED_FIFO线程都在等待锁相同的互斥且,则当互斥量
被解锁时,高优先级线程将总是被首先解除阻塞。
当然SCHED_RR和SCHED_FIFO还是有区别的,后者是先进先出,必须是一个线程运行完了后
才执行下一个线程。而SCHED_RR是在线程运行完设置的时间片后切换,虽然它是先运行优
先级高的线程,但是它先将此次运行过的线程放在线程队列的后面,再从前向后寻找优先
级高的线程,进行执行。
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
函数说明:获取线程的调度策略
9.int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);
函数说明:设置线程的调度参数
参数说明:参数一:线程属性变量
参数二:sched_parm 结构体
系统支持的最大和最小的优先级值可以用函数:int sched_get_priority_max( int policy );
int sched_get_priority_min( int policy );
注意参数是policy调用策略,也就是说对于不同的策略的值是不
一样的!
int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);
1.int pthread_create (pthread_t *pThread, const pthread_attr_t *pAttr, void * (*start_routine)(void *),void *arg);
函数说明:创建一个线程;
参数说明:参数一:线程id,创建线程时,为每一个线程分配一个Id。
参数二:线程属性,后面详细介绍线程属性。
参数三:线程函数,注意该函数返回值必须为void* 且参数同样也只能是
void*。
参数四:传递给线程函数的参数。
2.void pthread_exit(void *value_ptr);
函数说明:终止本线程(线程的退出可以是隐士退出也可以显示退出调用pthread_exit
函数)
参数说明:如果该参数value_ptr不为NULL,那么,此线程调用pthread_exit函数终止时
,线程退出返回的值为*value_ptr;
linux主线程里使用pthread_exit(val)结束时,只会使主线程结束,而由主线程创建的子线程并不会因此结束,他们继续执行。
主线程使用return结束时,那么子线程也就结束了。
函数说明:该函数功能有两个,一:等待指定的tid线程结束,将返回值存在value_ptr里
二:该函数会释放被等待线程所占用的资源。
参数说明:参数一:等待线程的id
参数二:该线程结束时,的返回值
需注意的是一个线程仅允许唯一的一个线程使用pthread_join()等待它的终止,否则后面调用的pthread_join会
返回错误;并且被等待的线程应该处于join(结合)状态,即非DETACHED(分离)状态,否则该pthread_join会直接返回错误。如果某个线程调用pthread_detach(th)后,线程状态变成分离状态,用pthread_join()等待该线程结束,并释放资源就会返回一个错误。pthread_exit 结束线程并设置线程的返回值,用pthread_join来获取线程结束时的返回
值。
3.int pthread_detach(pthread_t thread);
函数说明:分离一个线程,将该线程分离后,此线程结束后,会自动释放其所占资源。
一般来说,如果没有用pthread_detach分离的线程,都会使用ptread_join来回收其线程
所占资源
参数说明:分离某个线程的tid;
4.pthread_t pthread_self(void);
函数说明:获取本线程的tid(线程id),经常作为pthread_detach的参数
5.int pthread_key_create(pthread_key_t *key,void(*destructor)(void*));
函数说明:创建线程的私有变量,大家都知道,在多线程程序中,所有线程共享程序中的变量。现在有一全局变量,所有线程都可以使用它,改变它的值。而如果每个线程希望能单独拥有它,那么就需要使用线程存储了。表面上看起来这是一个全局变量,所有线程都可以使用它,而它的值在每一个线程中又是单独存储的。
参数说明:参数一:创建的私有变量
参数二:在线程结束退出后,调用该函数清理线程私有变量(即线程存储)
int pthread_setspecific(pthread_key_t key, const void *value);
函数说明:设置key(关键字)所关联的私有地址
参数说明:参数一:所要设置的关键字
参数二:key所要代表的那个地址
之后key的值就是关联的地址
void *pthread_getspecific(pthread_key_t key);
函数说明:该函数就是用来获取本线程私有变量key所关联的地址,之后可以转型使用
参数说明:pthread_key_create创建的线程私有变量
int pthread_key_delete(pthread_key_t key);
函数说明:删除键所占的内存;
例如:
/*三个线程:主线程,th1,th2各自有自己的私有数据区域
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
static pthread_key_t str_key;
//define a static variable that only be allocated once
static pthread_once_t str_alloc_key_once=PTHREAD_ONCE_INIT;
static void str_alloc_key();
static void str_alloc_destroy_accu(void* accu);
char* str_accumulate(const char* s)
{ char* accu;
pthread_once(&str_alloc_key_once,str_alloc_key);//str_alloc_key()这个函数只调用一次
accu=(char*)pthread_getspecific(str_key);//取得该线程对应的关键字所关联的私有数据空间首址
if(accu==NULL)//每个新刚创建的线程这个值一定是NULL(没有指向任何已分配的数据空间)
{ accu=malloc(1024);//用上面取得的值指向新分配的空间
if(accu==NULL) return NULL;
accu[0]=0;//为后面strcat()作准备
pthread_setspecific(str_key,(void*)accu);//设置该线程对应的关键字关联的私有数据空间
printf("Thread %lx: allocating buffer at %p\n",pthread_self(),accu);
}
strcat(accu,s);
return accu;
}
//设置私有数据空间的释放内存函数
static void str_alloc_key()
{ pthread_key_create(&str_key,str_alloc_destroy_accu);/*创建关键字及其对应的内存释放函数,当进程创建关键字后,这个关键字是NULL。之后每创建一个线程os都会分给一个对应的关键字,关键字关联线程私有数据空间首址,初始化时是NULL*/
printf("Thread %lx: allocated key %d\n",pthread_self(),str_key);
}
/*线程退出时释放私有数据空间,注意主线程必须调用pthread_exit()(调用exit()不行)才能执行该函数释放accu指向的空间*/
static void str_alloc_destroy_accu(void* accu)
{ printf("Thread %lx: freeing buffer at %p\n",pthread_self(),accu);
free(accu);
}
//线程入口函数
void* process(void *arg)
{ char* res;
res=str_accumulate("Resule of ");
if(strcmp((char*)arg,"first")==0)
sleep(3);
res=str_accumulate((char*)arg);
res=str_accumulate(" thread");
printf("Thread %lx: \"%s\"\n",pthread_self(),res);
return NULL;
}
//主线程函数
int main(int argc,char* argv[])
{ char* res;
pthread_t th1,th2;
res=str_accumulate("Result of ");
pthread_create(&th1,NULL,process,(void*)"first");
pthread_create(&th2,NULL,process,(void*)"second");
res=str_accumulate("initial thread");
printf("Thread %lx: \"%s\"\n",pthread_self(),res);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
pthread_key_delete(str_key); //释放key的内存
pthread_exit(0);
}
6.int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));
函数说明:一次执行函数,用来在多线程中,表示某个方法只会执行一次。(即在一个进
程里,参数二所指向的函数只会执行一次)
参数说明:参数一:表示一次性初始化,通常pthread_once_t
once_control=PTHREAD_ONCE_INIT来初始化;
参数二:指向某个函数
7.int pthread_cancel(pthread_t thread);
函数说明:该函数向指定的线程发送信号用来请求结束它,注意:只是请求;该线程也可以不结束,后
面会介绍。
参数说明:请求要结束线程的id;
8.int pthread_setcancelstate(int state, int *oldstate);
函数说明:函数用来设置本线程对pthread_cancel函数发送信号的反应;
参数说明:参数一:state有两种状态,PTHREAD_CANCEL_ENABLE(缺省)和
PTHREAD_CANCEL_DISABLE分别表示,忽略此信号(也就是用pthraed_cancel不能结束本线
程)和信号继续运行(可以结束本线程)
9.int pthread_setcanceltype(int type, int *oldtype);
函数说明:设置用pthread_cancel请求结束线程时,是立即结束还是延迟结束(取消点退
出)
参数说明:参数一:有两种取值PTHREAD_CANCEL_DEFFERED和
PTHREAD_CANCEL_ASYCHRONOUS分别表示取消点退出和立即退出
前提:在pthread_setcancelstate设置成ENABLE有效。
参数二:如果不为NULL,用来获取之前的取消类型值。
10.void pthread_testcancel(void);
函数说明:设置取消点。当然,除了pthread_testcancel设置的取消点外还有其他默认的
取消点;
11.void pthread_cleanup_push(void (*routine)(void *), void *arg);
void pthread_cleanup_pop(int execute);
注意:这两个函数要在同一个模块里(即{}),不能分开。
函数说明:这组函数叫线程清理函数,当线程结束时会调用线程清理函数routine所指向
的函数。
1)当函数 pthread_cleanup_pop(1)参数为非0时
本线程调用pthread_exit()时和其他线程调用pthread_cancel()和执行到
pthread_cleanup_pop函数时,会调用清理函数
2) 当函数 pthread_cleanup_pop(0)参数为0时
本线程调用pthread_exit()时和其他线程调用pthread_cancel(),会调用清理函数
二、线程属性介绍
typedef struct {
int threadAttrStatus; /* status flag */
size_t threadAttrStacksize; /* stack size */
void * threadAttrStackaddr; /* stack address */
size_t threadAttrGuardsize; /* guard address (RTP only)线
程栈末尾的警戒缓冲区大小 */
int threadAttrDetachstate; /* detach state 分离状态 */
int threadAttrContentionscope; /* contention scope 表线程竞
争CPU范围 */
int threadAttrInheritsched; /* inherit scheduler 继承性 */
int threadAttrSchedpolicy; /* scheduling policy 调度策
略 */
struct _Sched_param threadAttrSchedparam; /* sched param struct 调度参
数*/
} pthread_attr_t;
struct _Sched_param
{
int sched_priority; /* scheduling priority 表示线程的优先级 */
}
1.int pthread_attr_init(pthread_attr_t *attr);
函数说明:线程属性的初始化
参数说明:线程属性结构体指针,表示要设置的线程属性
2.int pthread_attr_destroy(pthread_attr_t *attr);
函数说明:销毁线程属性,使它恢复在调用pthread_attr_init以前;
参数说明:线程属性结构体指针,表示要设置的线程属性
3.int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
函数说明:设置线程属性栈的大小
参数说明: 参数一:线程属性结构体指针,表示要设置的线程属性
参数二:设置大小的值
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
函数说明:用来获取指定线程属性所设置的栈的大小
4.int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
函数说明:设置线程属性栈的地址
参数说明: 参数一:线程属性结构体指针,表示要设置的线程属性
参数二:所设置的地址(即stackaddr指向的地址)
int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);
函数说明:用来获取指定线程属性所设置的栈地址
5.int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
函数说明:设置线程属性的分离状态,分离线程,在该线程结束退出后会自动清理所占资
源;非分离线程则需要调用pthread_join来回收资源。
参数说明:参数一:线程属性结构体指针,表示要设置的线程属性
参数二:有两个值PTHREAD_CREATE_DETACHED(分离线程)
PTHREAD_CREATE_JOINABLE(非分离线程)
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
函数说明:获取线程属性的分离状态
6.int pthread_attr_setscope(pthread_attr_t *attr, int contentionscope);
函数说明:设置线程竞争CPU的范围
参数说明:参数一:线程属性结构体指针,表示要设置的线程属性
参数二:有两个值PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。
int pthread_attr_getscope(const pthread_attr_t *attr, int *contentionscope);
函数说明;获取指定线程属性的线程竞争范围情况
7.int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);
函数说明:用来设置线程的继承性。要么是从创建它的线程里继承调度属性(调度策略、
调度参数),要么是从线程属性里通过pthread_attr_setschedpolicy和
pthread_attr_setschedparam里获得调度属性。
参数说明:参数一:线程属性结构体指针,表示要设置的线程属性
参数二:有两个值选择,PTHREAD_INHERIT_SCHED: 新的线程调度策略和参数
继承于创建它的线程;
PTHREAD_EXPLICIT_SCHED:新的线程继承策略和参数来自于
schedpolicy和schedparam属性中显式设置的调度信息!
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);
函数说明:获取线程属性继承性
注: 继承性决定调度的参数是从创建它的进程中继承还是使用在
schedpolicy和schedparam属性中显式设置的调度信息。
8.int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
函数说明:设置线程调用策略
参数说明:参数一:线程属性变量
参数二:设置的策略,有三个值选择:
SCHED_FIFO :先进先出
SCHED_RR :轮转法
SCHED_OTHER :其他方法
SCHED_OTHER是不支持优先级使用的,而SCHED_FIFO和SCHED_RR
支持优先级的使用,他们分别为1和99,数值越大优先级越高.
注意:
> 此处的SCHED_FIFO是允许被高优先级抢占的!
> 也就是有高优先级的必须先运行
> SCHED_RR是设置一个时间片
> 当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量
上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤
醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先
织的SCHED_FIFO线程都在等待锁相同的互斥且,则当互斥量
被解锁时,高优先级线程将总是被首先解除阻塞。
当然SCHED_RR和SCHED_FIFO还是有区别的,后者是先进先出,必须是一个线程运行完了后
才执行下一个线程。而SCHED_RR是在线程运行完设置的时间片后切换,虽然它是先运行优
先级高的线程,但是它先将此次运行过的线程放在线程队列的后面,再从前向后寻找优先
级高的线程,进行执行。
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
函数说明:获取线程的调度策略
9.int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);
函数说明:设置线程的调度参数
参数说明:参数一:线程属性变量
参数二:sched_parm 结构体
系统支持的最大和最小的优先级值可以用函数:int sched_get_priority_max( int policy );
int sched_get_priority_min( int policy );
注意参数是policy调用策略,也就是说对于不同的策略的值是不
一样的!
int pthread_attr_getschedparam(const pthread_attr_t *attr,struct sched_param *param);
函数说明:获取线程属性的调度参数
希望可以帮助大伙