无法在C中返回线程的调度优先级

时间:2018-01-30 00:45:57

标签: c linux multithreading

我一直致力于艰巨的任务,需要大量的研究,而且我已经走到了尽头。我一直在阅读linux的手册页,但我很难吸收那里的任何信息。这是我在C编程的第三周。

我设法创建了一个新线程,并将其调度优先级设置为SCHED_FIFO。在我的程序中,我创建它,告诉它等待两秒钟,然后一旦完成我尝试打印出我给它的优先级(所以基本上,我希望它打印出来" policy = SCHED_FIFO& #34)。我也必须为SCHED_OTHER做这件事,但是一旦我理解了这一点,我就应该很容易做到这一点。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

void *FIFORunner(void *vargp, pthread_t thread);


int main(){
    pthread_t myThread;
    printf("Before Thread\n\n");

    pthread_create(&myThread, NULL, FIFORunner, NULL);

    pthread_join(myThread, NULL);

    printf("After Thread\n");

    return 0;
} 



void *FIFORunner(void *vargp, pthread_t myThread){

   int s, policy;

   struct sched_param param;

   pthread_setschedparam(&myThread, SCHED_FIFO, &param);

   sleep(2);

   s = pthread_getschedparam(myThread, &policy, &param);

   printf("policy = %d\n", policy);
   return NULL;
}

所以我的代码,没什么特别的。每当我运行它时,它会打印出一个看似随机的整数,例如:policy = 1464624896,policy = -1630095616,policy = 1487660800。

如何让pthread_getschedparam()工作?我传递了错误的东西吗?

1 个答案:

答案 0 :(得分:-1)

以下提议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 如果尝试提高优先级或安排级别,
  4. 将失败
  5. 正确检查错误
  6. 获得此基本代码后,您可以尝试尝试提升priority和/或scheduling级别。
  7. 建议在创建线程时在'attributes'参数中设置优先级和/或调度级别设置,因为在线程内部提升这些值不起作用
  8. 这是线程函数的语法:void *(*start_routine) (void *)请注意,只有一个参数,而不是两个参数。因此,OPs发布的代码无法编译。 (这不是唯一的原因)
  9. 关于:pthread_setschedparam(&amp; myThread,SCHED_FIFO,&amp; param);变量myThread是函数main()中的局部变量,因此在main()范围之外不可见。结果是发布的代码无法编译。
  10. 关于:void * FIFORunner(void * vargp)未使用参数vargp。这导致编译器输出警告消息。要消除警告消息,函数中的第一行应为:(void)vargp;
  11. 对于pthread_setschedparam(&myThread, SCHED_FIFO, &param);s = pthread_getschedparam(myThread, &policy, &param);,应检查返回的值(== 0)以确保操作成功。如果不成功,请调用perror()输出随附的文本以及系统认为操作失败的原因。
  12. 关于:return NULL;这将“有效”,但是,保留在pthread函数系列中的等效语句将是:pthread_exit( NULL );
  13. 现在,建议的代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <pthread.h>
    
    void *FIFORunner( void *vargp );
    
    
    int main( void )
    {
        pthread_t myThread;
        printf("Before Thread\n\n");
    
        // any priority and/or scheduling changes should be
        // applied via the second parameter to 'pthread_create()'
        pthread_create( &myThread, NULL, FIFORunner, NULL);
    
        printf( "in main: myThread = %d\n", (int)myThread );
    
        pthread_join( myThread, NULL );
    
        printf("After Thread\n");
    
        return 0;
    }
    
    
    void *FIFORunner( void *vargp )
    {
        (void)vargp;
    
       pthread_t myThread = pthread_self();
    
        int policy = SCHED_OTHER;   // any higher policy will cause 'pthread_setschedparam()` to fail.
    
    
        struct sched_param param;
        param.sched_priority = 0;   // any higher priority will cause 'pthread_setschedparam()` to fail.
    
    
        printf( "in Thread: myThread = %d\n", (int)myThread );
        if( pthread_setschedparam( myThread, policy, &param ) )
        {
            perror( "pthread_setschedparm failed" );
            pthread_exit( NULL );
        }
    
        sleep(2);
    
        if( pthread_getschedparam( myThread, &policy, &param ) )
        {
            perror( "pthread_getschedparam failed" );
            pthread_exit( NULL );
        }
    
        printf( "policy = %d\n", policy );
        pthread_exit( NULL );
    }