2016-07-04 2 views
3

У меня есть следующий источник, который бы иметь приоритет SCHED_RR 90:sched_setscheduler предназначен для всех потоков или основной темы?

int main(int argc, char** argv) 
{ 
    const char *sched_policy[] = { 
    "SCHED_OTHER", 
    "SCHED_FIFO", 
    "SCHED_RR", 
    "SCHED_BATCH" 
    }; 
    struct sched_param sp = { 
     .sched_priority = 90 
    }; 
    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_t tid ; 
    pthread_create(&tid , NULL, Thread1 , (void*)(long)3); 
    pthread_create(&tid , NULL, Thread2 , (void*)(long)3); 
    pthread_create(&tid , NULL, Thread3 , (void*)(long)3); 
    while(1) 
     sleep(100); 
} 

в то время как оболочка «сверху», я могу видеть, что процесс имеет PR с -91, посмотрите, как он работает, Насколько я знаю, в Linux, thread1 и thread2 и thread3 различные задачи от основного потока, они просто одни и те же виртуальную память, я хотел бы знать в этом тесте, мне нужно добавить

pthread_setschedparam(pthread_self(), SCHED_RR, &sp); 

для всех thread1, thread2 и thread3, так что все эти 3 могут быть schedu led с SCHED_RR?! или мне это не нужно?! и как я могу наблюдать , что потоки thread1, thread2 и thread3 являются SCHED_RR или SCHED_OTHER?!

Edit:

sudo chrt -v -r 90 ./xxx.exe 

будет видеть:

pid 7187's new scheduling policy: SCHED_RR 
pid 7187's new scheduling priority: 90 

как я могу быть уверен, что это только для основного потока?! или все потоки в pid 7187 - политика SCHED_RR?! и снова, как это наблюдать?!

ответ

3

Перед созданием нового потока вы должны проверить (и установить, если требуется) атрибуты наследования планировщика.

int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inheritsched);

int pthread_attr_setinheritsched(pthread_attr_t *attr, int inheritsched);

pthread_attr_getinheritsched() будет хранить в переменной, указываемой inheritsched один из двух возможных значений:

  • PTHREAD_INHERIT_SCHED - Темы, которые создаются с помощью Аттрибут
    наследует атрибуты планирования из создающего потока; атрибуты планирования в attr игнорируются.

  • PTHREAD_EXPLICIT_SCHED - Темы, созданные с помощью атр принять их планирования атрибуты значения, указанные в атрибуты объекта.

Если вы хотите, чтобы каждый вновь созданный поток наследует атрибуты планировщика вызывающей задачи, вы должны установить PTHREAD_INHERIT_SCHED (если он уже не установлен).

Также обратите внимание:

Значение по умолчанию атрибута унаследуют-планировщика в новом инициализирован атрибутов нити объект PTHREAD_INHERIT_SCHED

Ссылки

$ man pthread_setschedparam 
$ man pthread_attr_setinheritsched 
  • (Blockquoted материал был скопирован из частей выпуска 3.74 проекта человеко-страниц Linux.)
Смежные вопросы