Приоритет стека Pthreads - PullRequest
0 голосов
/ 19 июня 2019

У меня небольшие проблемы с приоритетом pthread. Я установил планировщик FIFO.У меня есть 2 потока, каждый имеет приоритет приоритета.На моем проекте, когда я нажимаю A или B, один поток начинает работать.Это нормально, но когда работает один поток и снова нажимает B (приоритет 15), а затем A (приоритет 20), я предполагаю, что поток A переходит до B в очереди стека и после первого потока будет следующим потоком A с приоритетом 20, а затем потоком B(15).Это проблема FIFO или что-то еще?PS: я не хочу использовать семафор, я хочу решить его с приоритетом и планировщиком.Спасибо

#include <stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<unistd.h>
#include <time.h>
#include <sched.h>

sem_t mutex;

void* levelOnefunction(void *a)
{
    sem_wait(&mutex);
    int* b = (int *) a;
    printf("Thread! next main!\n");
    printf("sched prior:%d\n",*b);
    sleep(3);
    sem_post(&mutex);
    return 0;
}

int main()
{
    char s;
    pthread_t t;
    pthread_attr_t tattr;
    struct sched_param param;

    sem_init(&mutex,0,1);
    pthread_attr_init(&tattr);

    if(pthread_attr_setschedpolicy(&tattr,SCHED_FIFO)!=0)
        printf("ERROR FIFO!\n");
    //pthread_setschedparam(t,SCHED_FIFO,&param);

    if(pthread_attr_getschedparam(&tattr,&param)!=0)
        printf("ERROR attr get sheduler!\n");

    /* int k =pthread_attr_setinheritsched(&tattr,PTHREAD_EXPLICIT_SCHED);

    if (k!=0)
        printf("ERROR\n"); */

    printf("Initial priority is %d \n",param.sched_priority);

    int min = sched_get_priority_min(SCHED_FIFO);
    int max = sched_get_priority_max(SCHED_FIFO);

    printf("MIN - %d ---> MAX - %d\n",min,max);

    scanf("%c",&s);

    while (s != '\0') 
    {
        if(s=='a')
        {
            printf("a\n");
            param.sched_priority=20;
            if(pthread_attr_setschedparam(&tattr,&param)!=0)
            printf("ERROR attr_setschedul!\n");
            printf("update priority is:%d\n",param.sched_priority);
            if(pthread_create(&t,&tattr,levelOnefunction,(void *)&param.sched_priority)!=0)
                printf("ERROR thread1\n");

            pthread_join(t,NULL);
            printf("main finish!\n");
            printf("%c end\n\n",s);
        }
        else if(s=='b')
        {
            printf("b\n");
            param.sched_priority=15;
            if(pthread_attr_setschedparam(&tattr,&param)!=0)
            printf("ERROR attr_setschedul!\n");
            if(pthread_create(&t,&tattr,levelOnefunction,(void *)&param.sched_priority)!=0)
            printf("ERROR Thread 2 ");

            pthread_join(t,NULL);
            printf("main finish!\n");
            printf("%c end\n\n",s);
        }
        else if(s=='\n')
        {
        }
        else if (s!='a' && s!='b')
        {
            printf("bad key\n");
        }
        scanf("%c",&s);
    }             
    sem_destroy(&mutex);     
    return 0;
}

1 Ответ

0 голосов
/ 20 июня 2019

Вы вызываете pthread_join() в главном потоке сразу после создания каждого дочернего потока.

Это означает, что у вас никогда не будет создано более одного дочернего потока за раз - после создания одного дочернего потока основной поток будет блокироваться в pthread_join() до тех пор, пока этот дочерний поток не будет завершен. Только затем снова вызывает scanf() и потенциально создает другой дочерний поток.

Приоритеты потоков не входят в это.

...