pthread_setschedparam问题,系统挂起

时间:2015-06-15 10:06:07

标签: c embedded pthreads posix rtos

static int pthrd_setthread_prio(int thred_prio)
{
    int                        thrd_policy = SCHED_RR;
    struct sched_param         thr_prio;
    int                        res=0;

    thr_prio.sched_priority = thred_prio;

    /* Try setting the thread/process priority via pthread */
    res = pthread_setschedparam(  pthread_self(), 
                                 thrd_policy,
                                 (const struct sched_param*) &thr_prio);

    //pthread_setschedparam has two return values 0 on successs, >0 on failure
    if(res != 0)
    {
       deb_err("pthread_setschedparam failed withe error %d\n",res);
    }

   res = pthread_getschedparam( pthread_self(), 
                                &thrd_policy,
                                &thr_prio);
    if(res < 0)
    {
       deb_err("pthread_getschedparam failed\n");
    }

    printf("Thread policy %s priority %d process id %ld\n", \
                   ( (thrd_policy == SCHED_FIFO)  ? "SCHED_FIFO" :
                     (thrd_policy == SCHED_RR)    ? "SCHED_RR" :
                     (thrd_policy == SCHED_OTHER) ? "SCHED_OTHER" : "???"),   thr_prio.sched_priority,   syscall(SYS_gettid));

    if ( (thr_prio.sched_priority != thred_prio) || (thrd_policy != SCHED_RR) )
    {
       deb_err("Thread priority ==  %d, this should be %d ERROR! using pthread\n",thr_prio.sched_priority ,thred_prio);
       res=-1;
    }

    return (res);
}

上面的代码用于设置线程优先级并创建线程2导致我的系统在某一点挂起。

我建立了一个telnet会话并使用&#34; ps -ef&#34;命令检查thread-2的实时优先级并正确查看其设置。但在后期它导致系统挂起。我通过删除此特定函数并为线程指定了默认优先级来确认这一点。

如果我在这里丢失任何东西,有人可以告诉我吗?

2 个答案:

答案 0 :(得分:1)

您在线程上设置了实时调度策略。这意味着只有更高优先级的实时任务可以抢占它,所以如果你的线程进入无限(或者只是非常长时间运行)的循环,它消耗CPU而不是阻塞,它将使其他非实时任务匮乏。

不应该阻止计算密集的线程不应该给出实时调度策略。

答案 1 :(得分:0)

我尝试增加父线程的线程优先级,它解决了这个问题。在我们的设计中,它像thread2(子线程)通过每100毫秒连续轮询将数据传输到thread1(父线程)。两者都应该具有更高的优先级,否则,我们最终会挂起问题。将优先级提高到最大值可解决此问题。