linux下线程常用的几个函数整理

1 获取线程ID

linux下获取线程ID有两种方法:

1)pid_t pid_id = gettid();

2)调用pthread_self()

gettid 获取的是内核中线程ID,而pthread_self 是posix描述的线程ID。

gettid 获取的是内核中真实线程ID,  对于多线程进程来说,每个tid实际是不一样的。

而pthread_self获取的是相对于进程的线程控制块的首地址, 只是用来描述统一进程中的不同线程

2、设置线程属性

这里只解释pthread_attr_t的其中几种属性

1)detach属性:如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。

即设置了detach属性后,就不要添加pthread_join(tid, NULL);这个了。(这相当于是两种方法,都可以使用)

2)policy属性:表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_attr_setschedpolicy ()来改变。
SCHED_OTHER 分时调度策略;
SCHED_FIFO实时调度策略,先到先服务
SCHED_RR实时调度策略,时间片轮转 
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。
SHCED_RR和SCHED_FIFO的不同:

当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。    

SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。

如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。

3)优先级属性:为struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,通过pthread_setschedparam()函数来改变,缺省为0。

pthread_attr_t pthread_attr;
pthread_attr_init(&pthread_attr);
pthread_attr_setschedpolicy(&pthread_attr, SCHED_FIFO);
pthread_attr_setdetachstate(&pthread_attr, PTHREAD_CREATE_JOINABLE);//这个可以不用设置,因为默认就是这个
pthread_join(tid, NULL);
发布了100 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/modi000/article/details/105379024