Alf*_*red 6 c posix pthreads thread-priority
我无法使用设置Pthread优先级pthread_attr_setschedparam()
.我试图解决这个问题,但无法解决.我还咨询了我的教科书,该教科书也使用相同的功能.我从书中复制了这段代码.你能告诉我如何设置线程优先级吗?
这是代码:
void *Func(void *arg);
int main()
{
pthread_t tid[5];
pthread_attr_t *tattr;
struct sched_param param;
int pr,error,i;
do
{
if( (tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)) )==NULL)
{
printf("Couldn't allocate memory for attribute object\n");
}
}while(tattr==NULL);
if(error=pthread_attr_init(tattr))
{
fprintf(stderr,"Attribute initialization failed with error %s\n",strerror(error));
}
for(i=0;i<5;i++)
{
//scanf("%d",&pr);
error = pthread_attr_getschedparam(tattr,¶m);
if(error!=0)
{
printf("failed to get priority\n");
}
param.sched_priority=10;
error=pthread_attr_setschedparam(tattr,¶m);
if(error!=0)
{
printf("failed to set priority\n");
}
/*
if(i%2==0)
{
if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_DETACHED))
{
fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error));
}
}
else
if(error=pthread_attr_setdetachstate(tattr,PTHREAD_CREATE_JOINABLE))
{
fprintf(stderr,"Failed to set thread attributes with error %s\n",strerror(error));
}
*/
pthread_create(&tid[i],tattr,Func,NULL);
printf("waiting for thread %d\n",i);
}
free(tattr);// release dynamically allocated memory
printf("All threads terminated\n");
return 0;
}
void *Func(void *arg)
{
printf("inside\n");
pthread_attr_t *tattr=(pthread_attr_t *)arg;
int state,error;
struct sched_param param;
error=pthread_attr_getdetachstate(tattr,&state);
if(error==0 && state==PTHREAD_CREATE_DETACHED)
{
printf(" My state is DETACHED\n");
}
else
if(error==0 && state==PTHREAD_CREATE_JOINABLE)
{
printf(" My state is JOINABLE\n");
}
error=pthread_attr_getschedpolicy(tattr,¶m);
if(error==0)
{
printf(" My Priority is %d\n",param.sched_priority);
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
您的pthread_attr_setschedparam
通话失败并显示"无效参数".您的程序将从默认的Linux调度策略开始SCHED_OTHER
.你不能改变优先权SCHED_OTHER
.
来自男人(2)sched_setscheduler
:
SCHED_OTHER只能在静态优先级0使用.SCHED_OTHER是标准的Linux时间共享调度程序,适用于不需要特殊静态优先级实时机制的所有进程.
如果在尝试更改程序的优先级之前将pthread属性中的策略更改为另一种计划,则程序将起作用.就像是
for (i = 0;i < 5;i++)
{
policy = SCHED_RR;
error = pthread_attr_setschedpolicy(tattr, policy);
// insert error handling
error = pthread_attr_getschedparam(tattr, ¶m);
// insert error handling
// yada yada yada ...
}
Run Code Online (Sandbox Code Playgroud)