Я пытаюсь протестировать одно приложение, которое будет запускать несколько потоков с различным приоритетом, поэтому ниже приводится мой тестовый файл 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);
Выглядит хорошо работать для меня.
Задача ещё не решена.
Других решений пока нет …