2017-10-19 22 views
1

在下面的代码片段中,我创建了6个线程。各有不同的优先级。全局优先级数组中提到了优先级。我正在根据线索索引在每个线程内连续增加全局变量。如果线程优先级更高,我期待计数更高。但我的输出不遵循优先概念pl。请参阅下面显示的输出顺序。我在Ubuntu 16.04和Linux内核4.10上尝试了这一点。Linux线程优先级,行为不正常

O/P, 

Thread=0 

Thread=3 

Thread=2 

Thread=5 

Thread=1 

Thread=4 

pid=32155 count=4522138740 

pid=32155 count=4509082289 

pid=32155 count=4535088439 

pid=32155 count=4517943246 

pid=32155 count=4522643905 

pid=32155 count=4519640181 

代码:

#include <stdio.h> 
#include <pthread.h> 
#define FAILURE -1 
#define MAX_THREADS 15 
long int global_count[MAX_THREADS]; 
/* priority of each thread */ 
long int priority[]={1,20,40,60,80,99}; 

void clearGlobalCounts() 
{ 
     int i=0; 
     for(i=0;i<MAX_THREADS;i++) 
       global_count[i]=0; 
} 

/** 
    thread parameter is thread index 
**/ 
void funcDoNothing(void *threadArgument) 
{ 
     int count=0; 
     int index = *((int *)threadArgument); 
     printf("Thread=%d\n",index); 
     clearGlobalCounts(); 
     while(1) 
     { 
       count++; 
       if(count==100) 
       {  
         global_count[index]++; 
         count=0; 
       } 
     } 
} 

int main() 
{ 
     int i=0; 
     for(int i=0;i<sizeof(priority)/sizeof(long int);i++) 
      create_thread(funcDoNothing, i,priority[i]); 
     sleep(3600); 
     for(i=0;i<sizeof(priority)/sizeof(long int);i++) 
     { 
       printf("pid=%d count=%ld\n",getpid(), 
           global_count[i]); 
     } 
} 

create_thread(void *func,int thread_index,int priority) 
{ 
    pthread_attr_t attr; 

    struct sched_param schedParam; 
    void *pParm=NULL; 
    int id; 
    int * index = malloc(sizeof(int)); 
    *index = thread_index; 
    void *res; 
    /* Initialize the thread attributes */ 
    if (pthread_attr_init(&attr)) 
    { 
      printf("Failed to initialize thread attrs\n"); 
      return FAILURE; 
    } 

    if(pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) 
    { 
      printf("Failed to pthread_attr_setschedpolicy\n"); 
      return FAILURE; 
    } 

    if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) 
    { 
      printf("Failed to setschedpolicy\n"); 
      return FAILURE; 
    } 

    /* Set the capture thread priority */ 
    pthread_attr_getschedparam(&attr, &schedParam);; 
    schedParam.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1; 
    schedParam.sched_priority = priority; 
    if (pthread_attr_setschedparam(&attr, &schedParam)) 
    { 
      printf("Failed to setschedparam\n"); 
      return FAILURE; 
    }  
    pthread_create(&id, &attr, (void *)func, index); 
} 

回答

0

pthread_attr_setschedparam文档说:

为了通过 pthread_attr_setschedparam()方面的参数设定为具有效果调用 在pthread_create时(3) ,调用者必须使用pthread_attr_setinheritsched(3) 来设置 的inherit-scheduler attrib将属性对象attr的属性设置为PTHREAD_EXPLICIT_SCHED。

所以你必须调用pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED),例如:

if (pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) != 0) { 
      perror("pthread_attr_setinheritsched"); 
    } 
    pthread_create(&id, &attr, (void *)func, index); 

注:您的代码会产生大量的编译器警告,你需要修复那些。您不想尝试测试具有大量未定义行为的代码 - 如某些警告所示。您应该将睡眠时间(3600)降低到几秒钟,因为当您在SCHED_FIFO下运行线程时,它们会占用您的CPU,并且机器在运行时会冻结。

+0

感谢输入,行为似乎好多了。我纠正了所有警告。 3600只是为了确保最初的调度延迟不会影响计数。 O/P现在是,PID = 31068计数= 0 PID = 31068计数= 15 PID = 31068计数= 56961864 PID = 31068计数= 56964895 PID = 31068计数= 57002126 PID = 31068计数= 56688136仍最高优先级任务行为并不那么一致。我尝试了30秒的睡眠,我会尝试更高的延迟。现在我已经以root身份运行程序,为什么会有这种限制? –