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

发布于 2022-09-01 15:58:37 字数 917 浏览 42 评论 0

线程表里面有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);
   }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不知所踪 2022-09-08 15:58:37

你怎么知道你的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"
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文