Linux线程优先,行为异常

时间:2017-10-19 16:01:51

标签: linux multithreading thread-priority

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

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);
}

1 个答案:

答案 0 :(得分:0)

pthread_attr_setschedparam的文档说:

  

为了进行参数设置   pthread_attr_setschedparam()在调用时生效   pthread_create(3),调用者必须使用pthread_attr_setinheritsched(3)   设置          属性对象attr的inherit-scheduler属性为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并且机器在运行时会出现冻结。