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, &param))//设置优先级
  {
    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; }

 

posted @ 2021-01-07 16:46  ho966  阅读(344)  评论(0编辑  收藏  举报