2016-07-15 59 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