/************************************************* * Function: Pthread_attr_setschedpriority() * Description: 设置线程优先级包裹函数 * Input: *attr---线程属性结构 inheritsched---线程优先级参数 * Output: *attr---线程属性结构 * Return: 0/errno *************************************************/ int Pthread_attr_setschedpriority(pthread_attr_t *attr, int priority) { struct sched_param params; int maxPriority, minPriority; int rval; if(attr==AII_NULL) { return -1; } /*检查用户设置的优先级合法性*/ rval = Pthread_get_priorityscope(SCHED_RR, &minPriority, &maxPriority); if (rval != 0) { return rval; } //debug_info(DEBUG_LEVEL_1,"pthread sched policy range is %d---%d\n", minPriority, maxPriority); if (priority < minPriority) { priority = minPriority; } else if (priority > maxPriority) { priority = maxPriority; } /*获取线程默认调度参数*/ rval = Pthread_attr_getschedparam(attr, ¶ms); if (rval != 0) { return rval; } /*修改线程优先级,设置线程调度属性*/ params.sched_priority = priority; rval = Pthread_attr_setschedparam(attr, ¶ms); if (rval != 0) { return rval; } return rval; }
/************************************************* * Function: Pthread_attr_getschedpriority() * Description: 获取线程优先级包裹函数 * Input: *attr---线程属性结构 * Output: *priority---线程优先级参数 * Return: 0/errno *************************************************/ int Pthread_attr_getschedpriority(const pthread_attr_t *attr, int *priority) { struct sched_param params; int rval; if(attr==AII_NULL || priority==AII_NULL) { return -1; } rval = Pthread_attr_getschedparam(attr, ¶ms); if (rval != 0) { return rval; } *priority = params.sched_priority; return rval; }
int main(int argc, char **argv) { int n, scope; pthread_t t; pthread_attr_t attr; struct sched_param param; unsigned seed = 1; Pthread_attr_init(&attr); if (argc == 1) { printf("PTHREAD_SCOPE_PROCESS\n"); Pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS); } else { printf("PTHREAD_SCOPE_SYSTEM\n"); Pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); } Pthread_attr_getschedparam(&attr, ¶m); printf("sched_priority %d\n", param.sched_priority); Pthread_mutex_lock(&m); for (n = 0; n < 20; ++n) { param.sched_priority = rand_r(&seed) % 128; printf("creating thread %02d prio %02d\n", n, param.sched_priority); Pthread_attr_setschedparam(&attr, ¶m); Pthread_create(&t, &attr, Thread, (void *)n); } sleep(1); Pthread_mutex_unlock(&m); pthread_exit(NULL); }