c++ linux pthread函数

来源:互联网 发布:淘宝优木家具怎么样 编辑:程序博客网 时间:2024/06/14 14:49
一、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函数终止时
,线程退出返回的值为*value_ptr;
int pthread_join(pthread_t tid,void**value_ptr);
函数说明:该函数功能有两个,一:等待指定的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);

函数说明:获取线程属性的调度参数


希望可以帮助大伙




原创粉丝点击