Приоритет нити в NPTL
Привет всем!
Пытаюсь создать thread с недефолтовым приоритетом. Столкнулся с пока
необъяснимым поведением. Попытка установить приоритет нити через
pthread_attr_* приводит к тому, что нить создается с дефолтовым
приоритетом. Однако использование pthread_setschedparam() на уже
работающую нить приводит к желаемому результату.
Пример кода. Если запустить его с правами рута, то видно, что thread_routine()
стартует с policy=0, prio=0, хотя в атрибутах нити было явно указано другое.
А через секунду из main() устанавливается требуемая политика и приоритет, и
thread_routine() выводит, что она изменилась.
Что это за поведение и чем оно обосновано?
---------------------------------
#include <errno.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <pthread.h>
void *thread_routine(void* arg)
{
int status = 0;
int policy, prev_policy;
struct sched_param param, prev_param;
int num = (int) arg;
status = pthread_getschedparam(pthread_self(), &policy, ¶m);
if (status)
assert(0);
printf("Thread %d is running with policy=%d, prio=%d\n", num, policy, param.sched_priority);
prev_policy = policy;
prev_param = param;
while(1) {
if((policy != prev_policy) || (param.sched_priority != prev_param.sched_priority)) {
printf("Thread %d is running with policy=%d, prio=%d\n", num, policy, param.sched_priority);
prev_policy = policy;
prev_param.sched_priority = param.sched_priority;
}
status = pthread_getschedparam(pthread_self(), &policy, ¶m);
if (status)
assert(0);
sleep(1);
}
}
int main()
{
int status = 0;
pthread_t id;
pthread_attr_t attr;
int prio;
int policy;
struct sched_param param;
param.sched_priority = sched_get_priority_min(SCHED_RR);
status |= pthread_attr_init(&attr);
status |= pthread_attr_setschedpolicy(&attr, SCHED_RR);
status |= pthread_attr_setschedparam(&attr, ¶m);
status |= pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
status |= pthread_create(&id, &attr, thread_routine, (void*)0);
if (status != 0)
assert(0);
while(1) {
sleep(1);
status = pthread_setschedparam(id, SCHED_RR, ¶m);
if (status != 0)
printf("status=%d: %s\n", status, strerror(errno));
}
return 0;
}
Reply to: