2016-07-15 4 views
1

Я тестирую ожидающую политику семафора Linux.Linux semaphore.h ожидающая/ожидающая политика quene

Linux страница руководство не сообщает ожидающие политик: http://linux.die.net/man/3/sem_wait,

Может быть, решено планировщиком. Это означает, что приоритетный поток, ожидающий этого семафора, может работать первым.

Поэтому я создаю 4 pthreads с приоритетом 10, 20, 30, 40 и устанавливаю политику планировщика в SCHED_FIFO.

Однако результат теста показывает, что ожидающая политика - это FIFO. Кто-нибудь знает, есть ли какой-либо документ или исходный код semaphore.h для ожидания информации о политике?

Благодаря

#include <string.h> 
#include <pthread.h> 
#include <semaphore.h> 
#include "stdlib.h" 
#include "stdio.h" 

sem_t b_sem; 

int test_routine(int my_num) 
{ 
    usleep(1+ my_num * 1000); 
    printf("I'm %d, going to wait sem\n", my_num); 
    sem_wait(&b_sem); 
    printf("I'm %d, I got the sem\n", my_num); 
    while(1) 
    { 
      sleep(1); 
    } 
} 

int main() 
{ 
    int i; 
    int pthrid[4] = {0,0,0,0}; 
    pthread_attr_t attr[4]; 
    struct sched_param prv_priority[4]; 

    struct sched_param param; 
    param.sched_priority = sched_get_priority_max(SCHED_FIFO); 
    sched_setscheduler(0, SCHED_FIFO, &param); 

    sem_init(&b_sem, 1, 0); 

    for(i = 0 ; i < 4 ; i++) 
    { 
      pthread_attr_init(&attr[i]); 
      pthread_attr_getschedparam(&attr[i], &prv_priority[i]); 
      pthread_attr_setschedpolicy(&attr[i], SCHED_FIFO); 
      prv_priority[i].sched_priority = (10 + i*10); 
      printf("test start, thread %d has priority %d\n", i ,prv_priority[i].sched_priority); 
      pthread_attr_setschedparam(&attr[i], &prv_priority[i]); 
      pthread_create(&pthrid[i], &attr[i], test_routine, i); 
    } 

    sleep(1); 

    for(i = 0 ; i < 4 ; i++) 
    { 
      printf("give sem\n"); 
      sem_post(&b_sem); 
      sleep(1); 
    } 

    sleep(100000); 

} 

результат:

test start, thread 0 has priority 10 
test start, thread 1 has priority 20 
test start, thread 2 has priority 30 
test start, thread 3 has priority 40 
I'm 0, going to wait sem 
I'm 1, going to wait sem 
I'm 2, going to wait sem 
I'm 3, going to wait sem 
give sem 
I'm 0, I got the sem 
give sem 
I'm 1, I got the sem 
give sem 
I'm 2, I got the sem 
give sem 
I'm 3, I got the sem 

ответ

0

Вашего тест сломан.

По умолчанию новые потоки наследуют политику планирования потока, который их создал. Вы никогда не переопределяете это значение по умолчанию. Перед тем, как позвонить pthread_create, сделайте следующее:

 pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED); 

Кроме того, вы должны либо запустить программу как root или иным образом дать ему разрешение на использование SCHED_RR.

Кстати, один критический ключ использовал ps axlm, чтобы проверить приоритеты потоков и увидеть, что они все одинаковые.

+0

Большое спасибо! Я получил исключенный результат после "pthread_attr_setinherchedched" – Wanga