[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Приоритет нити в 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, &param);

    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, &param);
        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, &param);
    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, &param);

        if (status != 0)
            printf("status=%d: %s\n", status, strerror(errno));

    }

    return 0;
}



Reply to: