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, ¶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