首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux semaphore.h挂起/等待队列策略

Linux semaphore.h挂起/等待队列策略
EN

Stack Overflow用户
提问于 2016-07-15 18:13:35
回答 1查看 212关注 0票数 1

我正在测试linux信号量的挂起策略。

Linux的手册页没有告诉挂起的策略:http://linux.die.net/man/3/sem_wait

也许这是由调度程序决定的。这意味着在此信号量上挂起的最高优先级线程可以首先运行。

因此,我创建了4个优先级分别为10、20、30、40的pthread,并将调度程序策略设置为SCHED_FIFO。

然而,测试结果表明,挂起的策略是FIFO。有没有人知道semaphore.h是否有用于等待策略信息的文档或源代码?

谢谢

代码语言:javascript
运行
复制
#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);

}

结果:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-15 18:34:08

你的测试失败了。

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

代码语言:javascript
运行
复制
     pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED);

此外,您必须以root用户身份运行您的程序,或者授予它使用SCHED_RR的权限。

顺便说一句,一个关键的线索是使用ps axlm检查线程优先级,并查看它们是否都相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38393533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档