gpt4 book ai didi

Linux线程优先级,行为异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:47 26 4
gpt4 key购买 nike

在下面的代码片段中,我创建了 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);
}

最佳答案

pthread_attr_setschedparam 的文档说:

In order for the parameter setting made by pthread_attr_setschedparam() to have effect when calling pthread_create(3), the caller must use pthread_attr_setinheritsched(3) to set the inherit-scheduler attribute of the attributes object attr to 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);

注意:您的代码会产生很多编译器警告,您需要修复这些警告。您不想尝试测试具有许多未定义行为的代码 - 如某些警告所示。您可能应该将 sleep(3600) 降低到几秒钟,因为当您让线程在 SCHED_FIFO 下运行时,它们会占用您的 CPU,并且机器在运行时会出现卡住状态。

关于Linux线程优先级,行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46834161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com