2016-07-15 11 views
1

私はLinuxのセマフォの保留ポリシーをテストしています。Linux semaphore.h保留中/待機中のポリシー

、Linuxのmanページには、保留中のポリシーを教えてくれない: http://linux.die.net/man/3/sem_wait

多分それは、スケジューラによって決めています。これは、このセマフォ上で保留中の最優先スレッドが最初に実行できることを意味します。

したがって、プライオリティ10,20,30,40の4つの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を使用する権限を与える必要があります。

ところで、1つの重要なヒントはps axlmを使用してスレッドの優先順位をチェックし、それらがすべて同じであることを確認することでした。

+0

ありがとうございました!私は "pthread_attr_setinheritsched"の後に例外的な結果を得ました – Wanga

関連する問題