【问题标题】:Linux semaphore.h pending / waiting quene policyLinux semaphore.h 挂起/等待队列策略
【发布时间】:2016-07-15 10:13:34
【问题描述】:

我正在测试 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

【问题讨论】:

    标签: c linux synchronization semaphore


    【解决方案1】:

    你的测试失败了。

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

         pthread_attr_setinheritsched(&attr[i], PTHREAD_EXPLICIT_SCHED);
    

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

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

    【讨论】:

    • 非常感谢!在“pthread_attr_setinheritsched”之后我得到了例外结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2020-03-27
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多