gpt4 book ai didi

c - Pthreads 堆栈优先级

转载 作者:行者123 更新时间:2023-11-30 21:05:07 25 4
gpt4 key购买 nike

我在 pthread 优先级方面没有什么问题。我已经设置了调度程序 FIFO。我有 2 个线程,每个线程都有不同的优先级。在我的项目中,当我按下 A 或 B 时,一个线程开始工作。那很好,但是当一个线程工作并再次推送 B(优先级 15)然后 A(优先级 20)时,我的假设是线程 A 在堆栈队列中的 B 之前跳转,并且在第一个线程之后将由优先级为 20 的下一个线程 A 跳转,然后是线程 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;
}

最佳答案

创建每个子线程后,您将立即在主线程中调用 pthread_join()

这意味着一次不会创建多个子线程 - 创建一个子线程后,主线程将在 pthread_join() 中阻塞,直到该子线程完成。只有然后它才会再次调用scanf()并可能创建另一个子线程。

线程优先级不受影响。

关于c - Pthreads 堆栈优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56663366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com