Linux semaphore.h pending / waiting quene policy

时间:2016-07-15 10:13:35

标签: c linux synchronization semaphore

我正在测试linux的信号量的未决政策。

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

1 个答案:

答案 0 :(得分:0)

你的考试被打破了。

默认情况下,新线程会继承创建它们的线程的调度策略。您永远不会覆盖此默认值。在致电pthread_create之前,请执行以下操作:

     pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED);

此外,您必须以root方式运行程序,或以其他方式授予其使用SCHED_RR的权限。

顺便说一下,一个关键线索就是使用ps axlm检查线程优先级并看到它们都是一样的。