linux网络编程之posix 线程(二)
进程的调度策略和优先级属于主线程,换句话说就是设置进程的调度策略和优先级只 会影响主线程的调度策略和优先级,而不会改变对等线程的调度策略和优先级(注这句话不完全正确)。每个对等线程可以拥有它自己的独立于主线程的调度策略和优先级。 在 Linux 系统中,进程有三种调度策略:SCHED_FIFO、SCHED_RR 和 SCHED_OTHER,线程也不例外,也具有这三种策略。 在 pthread 库中,提供了一个函数,用来设置被创建的线程的调度属性:是从创建者线 程继承调度属性(调度策略和优先级),还是从属性对象设置调度属性。该函数就是: int pthread_attr_setinheritsched (pthread_attr_t * attr, int inherit) 其中,inherit 的值为下列值中的其一: enum { PTHREAD_INHERIT_SCHED, //线程调度属性从创建者线程继承 PTHREAD_EXPLICIT_SCHED //线程调度属性设置为 attr 设置的属性 }; 如果在创建新的线程时,调用该函数将参数设置为 PTHREAD_INHERIT_SCHED 时,那么当修改进程的优先级时,该进程中继承这个优先级并且还没有改变其优先级的所 有线程也将会跟着改变优先级(也就是刚才那句话部正确的原因)。 下面写个程序测试一下: #include <unistd.h> #include <sys/types.h> #include <pthread.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0) int main(void) { pthread_attr_t attr; pthread_attr_init(&attr); int state; pthread_attr_getdetachstate(&attr, &state); if (state == PTHREAD_CREATE_JOINABLE) printf("detachstate:PTHREAD_CREATE_JOINABLEn"); else if (state == PTHREAD_CREATE_DETACHED) printf("detachstate:PTHREAD_CREATE_DETACHED"); size_t size; pthread_attr_getstacksize(&attr, &size); printf("stacksize:%dn", size); pthread_attr_getguardsize(&attr, &size); printf("guardsize:%dn", size); int scope; pthread_attr_getscope(&attr, &scope); if (scope == PTHREAD_SCOPE_PROCESS) printf("scope:PTHREAD_SCOPE_PROCESSn"); if (scope == PTHREAD_SCOPE_SYSTEM) printf("scope:PTHREAD_SCOPE_SYSTEMn"); int policy; pthread_attr_getschedpolicy(&attr, &policy); if (policy == SCHED_FIFO) printf("policy:SCHED_FIFOn"); else if (policy == SCHED_RR) printf("policy:SCHED_RRn"); else if (policy == SCHED_OTHER) printf("policy:SCHED_OTHERn"); int inheritsched; pthread_attr_getinheritsched(&attr, &inheritsched); if (inheritsched == PTHREAD_INHERIT_SCHED) printf("inheritsched:PTHREAD_INHERIT_SCHEDn"); else if (inheritsched == PTHREAD_EXPLICIT_SCHED) printf("inheritsched:PTHREAD_EXPLICIT_SCHEDn"); struct sched_param param; pthread_attr_getschedparam(&attr, ¶m); printf("sched_priority:%dn", param.sched_priority); pthread_attr_destroy(&attr); return 0; } 在调用各个函数设置线程属性对象的属性时需要先调用pthread_attr_init 初始化这个对象,最后调用pthread_attr_destroy 销毁这个对象。 simba@ubuntu:~/Documents/code/linux_programming/UNP/pthread$ ./pthread_attr detachstate:PTHREAD_CREATE_JOINABLE stacksize:8388608 guardsize:4096 scope:PTHREAD_SCOPE_SYSTEM policy:SCHED_OTHER inheritsched:PTHREAD_INHERIT_SCHED sched_priority:0 (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |