linux线程pthread_attr_t和pthread_equal和pthread_self

Posix线程中的线程属性pthread_attr_t主要包括detach属性、policy属性、优先级、继承属性、堆栈地址、scope属性、堆栈大小。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。

  1. detach属性:__detachstate,如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。使用pthread_attr_setdetachstate()设置
  2. policy属性:__schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_attr_setschedpolicy ()来改变。
  3. 优先级:__schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
  4. 继承属性:__inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。通过pthread_attr_setinheritsched()设置,缺省为PTHREAD_EXPLICIT_SCHED
  5. scope属性:__scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。通过pthread_attr_setscope()设置。

创建线程前先调用pthread_attr_init()进行线程属性初始化,然后设置各个属性,设置好属性后调用拉起线程

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);

tidp:指向线程句柄的指针

attr:线程属性结构体

start_rtn:线程函数指针

arg:线程函数的参数
————————————————

pthread_t uc_tid;

pthread_attr_t ta;

pthread_attr_init(&ta);

pthread_attr_setdetachstate(&ta, PTHREAD_CREATE_DETACHED); 

pthread_attr_setschedpolicy((pthread_attr_t *)&ta, SCHED_RR);

pthread_create(&uc_tid, &ta, (void *)uc_main__, NULL);

pthread_equal和pthread_self

1、引入pthread_equal的原因:

       在线程中,线程ID的类型是pthread_t类型,由于在Linux下线程采用POSIX标准,所以,在不同的系统下,pthread_t的类型是不同的,比如在ubuntn下,是unsigned long类型,而在solaris系统中,是unsigned int类型。而在FreeBSD上才用的是结构题指针。 所以不能直接使用==判读,而应该使用pthread_equal来判断。

2、引入pthread_self的原因:

        在使用pthread_create(pthread_t *thread_id,NULL,void* (*fun) (void *),void * args);虽然第一个参数中已经保存了线程ID,但是,前提是主线程首先执行时,才能实现的,而如果不是,那么thread指向一个未出划的变量。那么才子线程想使用时,应该使用pthread_self();

#include <pthread.h>
#include <stdio.h>
int main(){
    pthread_t pid1;
    pthread_t pid2;
  
    pid1 = pthread_self();
    pid2 = pthread_self();
 
   printf("pid1:%u, pid2:%u, equal:%d", (unsigned int)pid1, (unsigned int)pid2, 
          (pthread_equal(pid1, pid2) > 0));
 
   return 0;
 }

运行结果

pid1:545519376, pid2:545519376, equal:1

Linux获取线程tid线程名

//thread name
char cThreadName[32] = {0};
prctl(PR_SET_NAME, "111_222");
prctl(PR_GET_NAME, (unsigned long)chThreadName);

//tid
syscall(SYS_gettid)
原创文章 96 获赞 48 访问量 6万+

猜你喜欢

转载自blog.csdn.net/wteruiycbqqvwt/article/details/100554166