Linux:POSIX计时器忽略线程优先级

时间:2015-07-13 05:30:49

标签: linux scheduling posix

我有一个必须每毫秒运行一次的线程。当程序的其他任何线程都没有激活时,一切都很好。但是如果有超过3个其他线程正在运行,则Timer-Thread每秒调用次数少于100次(在我的测试机器上)。 似乎忽略了Timer的优先级设置。

我已使用内核版本3.12和3.18对此进行了测试。

测试代码,在10000次调用定时器线程后打印一些值(通常在10秒后):

#define NTHREADS 3

#include <sched.h>
#include <pthread.h>
#include <signal.h>

timer_t timer;
unsigned long long val = 0;
pthread_attr_t attrHigh, attrLow;


void TimerTestThread()
{    
       val++;

       if(val >= 10000)
        printf("%i ", val);
}

void BusyThread()
{
    int a;
    while(1)
    {
       a++;
    }
}

int main()
{
    pthread_attr_init(&attrHigh);
    pthread_attr_setinheritsched(&attrHigh, PTHREAD_EXPLICIT_SCHED);
    pthread_attr_setschedpolicy(&attrHigh, SCHED_FIFO);
    struct sched_param paramHigh;
    paramHigh.sched_priority = 90;
    pthread_attr_setschedparam(&attrHigh, &paramHigh);

    pthread_attr_init(&attrLow);
    pthread_attr_setinheritsched(&attrLow, PTHREAD_EXPLICIT_SCHED);
    pthread_attr_setschedpolicy(&attrLow, SCHED_FIFO);
    struct sched_param paramLow;
    paramLow.sched_priority = 1;
    pthread_attr_setschedparam(&attrLow, &paramLow);

    struct sigevent evp;
    evp.sigev_notify = SIGEV_THREAD;
    evp.sigev_notify_function = TimerTestThread;
    evp.sigev_notify_attributes = &attrHigh;

    struct itimerspec value;
    value.it_interval.tv_sec = 0;           // Interval
    value.it_interval.tv_nsec = 1000000;
    value.it_value.tv_sec = 0;              // Initial Expiration
    value.it_value.tv_nsec = 1000000;

    int i;
    pthread_t threads[NTHREADS];
    for(i=0; i<NTHREADS;i++)
    {
        pthread_create(&(threads[i]), &attrLow, BusyThread, NULL);
    }

    if(timer_create(CLOCK_MONOTONIC, &evp, &timer) != 0)
    {
        i = 5;
    }
    if(timer_settime(timer, 0, &value, NULL) != 0)
    {
        i = 6;
    }

    while(1);
}

我不明白为什么行为是这样的。也许你会看到我错过的东西。

编辑:更正了愚蠢的源副本错误

0 个答案:

没有答案