我正在测试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, ¶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发布于 2016-07-15 18:34:08
你的测试失败了。
默认情况下,新线程继承创建它们的线程的调度策略。您永远不会覆盖此默认值。在调用pthread_create之前,请执行以下操作:
     pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED);此外,您必须以root用户身份运行您的程序,或者授予它使用SCHED_RR的权限。
顺便说一句,一个关键的线索是使用ps axlm检查线程优先级,并查看它们是否都相同。
https://stackoverflow.com/questions/38393533
复制相似问题