私は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, ¶m);
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
ありがとうございました!私は "pthread_attr_setinheritsched"の後に例外的な結果を得ました – Wanga