2016-07-15 95 views
1

我正在測試未決的Linux信號量策略。Linux的semaphore.h等待/等待隊列策略

的Linux的手冊頁並沒有告訴未決的政策: http://linux.die.net/man/3/sem_wait

也許這是由調度決定。這意味着該信號量的最高優先級線程可以先運行。

因此,我創建了4個優先級爲10,20,30,40的pthread,並將調度程序策略設置爲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_setinheritsched」之後我得到了例外結果 – Wanga