首页 > pthread多线程调度问题(SCHED_FIFO vs SCHED_OTHER)

pthread多线程调度问题(SCHED_FIFO vs SCHED_OTHER)

线程表里面有10个线程,依次初始化各个线程属性、设置堆栈大小并创建线程。
有一个线程入口函数是d_main(),对于这个线程,设置调度策略SCHED_FIFO,其他线程默认初始化为SCHED_OTHER。

按照我的理解,d_main是实时线程,其余线程是分时线程,d_main在运行时应该是不会被别的线程所抢占CPU的。但是实际运行起来还是出现了d_main被抢占CPU的情况,请问问题出在哪里?

如果是我对posix线程模型理解有误,那怎么以最小的改动能使得d_main线程不会被其他线程抢占CPU呢?

代码如下:

ppThread = g_ThreadTable;
for(i = 0; i < g_NumThreads; i++, ppThread++)
  {
    if(NULL != ppThread->entry)
    {
      pthread_attr_t attr;

      /* init to default values */
      pthread_attr_init(&attr);

      /* set stacksize */
      pthread_attr_setstacksize(&attr,
        PTHREAD_STACK_MIN + ppThread->stackSize);

      if(ppThread->entry == d_main)
      {
        pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
      }
      // create thread
      ret = pthread_create(&(ppThread->threadId), &attr, ppThread->entry, (void *) ppThread);
   }
}

你怎么知道你的realtime thread被“抢占”了呢?说不定只是另外一个CPU上跑了点别的东西呢?
要不你禁掉其它CPU,只留一个再试试?

sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu1/online"
sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu2/online"
sudo sh -c "echo 0 > /sys/devices/system/cpu/cpu3/online"
...
【热门文章】
【热门文章】