pthread的使用总结
1、通过命令cat /proc/$PID/task/$TID/sched可以查看线程的调度策略和优先级,
0 — SCHED_OTHER 1 — SCHED_FIFO 2 — SCHED_RR
这里的优先级和struct sched_param 里面字段sched_priority的值时反的,
通过pthread_attr_setschedparam函数设置优先级时,sched_priority的值是按1--99,小---大的逻辑,截图里是反着的
2、开启SCHED_FIFO实时线程,需要先不继承父进程的调度策略才会生效,而且需要有root权限
3、使用案例
void* ThreadBody(void* arg) { … } pthread_attr_t attr; pthread_t handle; int iPolicy;// 调度策略 int iPriority;// 优先级 if (pthread_attr_init(&attr) != 0) { return false; } if (iPolicy == SCHED_FIFO) { // para2: PTHREAD_INHERIT_SCHED--继承父进程的调度策略, PTHREAD_EXPLICIT_SCHED--不继承 // 只有不继承父线程的调度策略才可以设置线程的调度策略 if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)) { return false; } //para2: SCHED_FIFO--先进先出, SCHED_RR--时间片轮询法, SCHED_OTHER--分时调度,无优先级 if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) { return false; } //设置线程优先级,1--99,小---大 struct sched_param param; int priorMin = sched_get_priority_min(SCHED_FIFO);//最小优先级 int priorMax = sched_get_priority_max(SCHED_FIFO);//最大优先级 param.sched_priority = iPriority; if (pthread_attr_setschedparam(&attr, ¶m))//设置优先级 { return false; } } else// 分时调度
{ if (pthread_attr_setschedpolicy(&attr, SCHED_OTHER)) { return false; } }
//创建线程 para1:线程标识符;para2:线程属性设置;para3:线程函数的起始地址;para4传递给start_routine的参数; int ret = pthread_create(&handle, &attr, (void*(*)(void*))ThreadBody, (void*)m_internal); if (ret) { return false; } if (pthread_detach(handle))//线程状态设置为detached,线程运行结束后会自动释放资源 { return false; }