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