pthread_attr_setinheritsched для sched_setscheduler

Я пытаюсь протестировать одно приложение, которое будет запускать несколько потоков с различным приоритетом, поэтому ниже приводится мой тестовый файл ap, работающий в linux x86_64:

pthread_spinlock_t orderspinlock ;
int iGlbCnt=0 ;

void * donothing(void *arg)
{
pthread_attr_t attr;
pthread_attr_init (&attr);
//int s = pthread_attr_setinheritsched (&attr, PTHREAD_INHERIT_SCHED );
int s = pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED  );
if( s != 0 ){
printf("pthread_attr_setinheritsched error \n");
exit(0) ;
}

int ipriority = (int)(long) arg ;
const char *sched_policy[] = {
"SCHED_OTHER",
"SCHED_FIFO",
"SCHED_RR",
"SCHED_BATCH"};
struct sched_param sp = {
.sched_priority = ipriority
};
pid_t pid = getpid();
printf("pid=(%d)\n",pid);
sched_setscheduler(pid, SCHED_RR, &sp);
printf("Scheduler Policy is %s.\n", sched_policy[sched_getscheduler(pid)]);

pthread_detach(pthread_self());
int icnt=0;
while(1){
usleep( 1 ) ;
pthread_spin_lock(&orderspinlock) ;
iGlbCnt++ ;
pthread_spin_unlock(&orderspinlock) ;
if( ++icnt > 10000000 )
break;
}
printf("thread done...(%d)\n",iGlbCnt);
}
int main(int argc, char **argv)
{
pthread_spin_init(&orderspinlock, 0);

pthread_attr_t attr;
pthread_attr_init (&attr);
//int s = pthread_attr_setinheritsched (&attr, PTHREAD_INHERIT_SCHED );
int s = pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED  );
if( s != 0 ){
printf("pthread_attr_setinheritsched error \n");
exit(0) ;
}

pthread_t tid;
pthread_create(&tid, NULL, &donothing, (void *)(long) 80);
pthread_create(&tid, NULL, &donothing, (void *)(long) 10);
while( 1 )
sleep( 5 ) ;
}

и g ++ —std = c ++ 11 y.cpp -pthread -o y.exe

бежать :

sudo chrt -r -v 66 ./y.exe

другой терминал следит за темами

 top -H -p `pidof y.exe`

Я вижу нити PR -67, -67, -11, после того, как умирают оба бесполезных потока,
основной поток PR = -11, что мне делать, чтобы все три темы
Приоритет -81, -11, -67 и основной поток держится в -67 до конца ?!

Редактировать :

int policy = 2 ;
s = pthread_setschedparam(pthread_self(),policy,&sp) ;

вместо :

pid_t pid = getpid();
sched_setscheduler(pid, SCHED_RR, &sp);

Выглядит хорошо работать для меня.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]