gpt4 book ai didi

C P线程优先级: Unable to get expected behavior

转载 作者:行者123 更新时间:2023-11-30 18:33:16 25 4
gpt4 key购买 nike

在这里,我尝试创建两个线程,为它们分配优先级/策略并获得预期的行为。

预期行为:具有最高优先级的线程(在本例中为线程 1)应始终首先执行。我所看到的:线程输出混合在一起,这意味着没有遵循优先级。

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <sched.h>


void *thread_func1 ();
void *thread_func2 ();

int main (){

pthread_t thread1, thread2;
pthread_attr_t attr1, attr2;

struct sched_param param1, param2;

int thread1_prio = 70;
int thread2_prio = 69;

int policy1, policy2;

policy1 = SCHED_RR;
policy2 = SCHED_RR;

pthread_attr_init(&attr1);
pthread_attr_init(&attr2);


param1.sched_priority = thread1_prio;
param2.sched_priority = thread2_prio;

pthread_attr_setschedparam(&attr1, &param1);
pthread_attr_setschedparam(&attr2, &param2);

pthread_attr_setschedpolicy(&attr1, policy1);
pthread_attr_setschedpolicy(&attr2, policy2);

pthread_attr_getschedparam(&attr1, &param1);
pthread_attr_getschedparam(&attr2, &param2);

pthread_attr_getschedpolicy(&attr1, &policy1);
pthread_attr_getschedpolicy(&attr2, &policy2);

pthread_create(&thread1, &attr1, thread_func1, NULL);
pthread_create(&thread2, &attr2, thread_func2, NULL);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);


return 0;
}

void *thread_func1 (void *var){

for (int i = 0; i<5; i++){
printf("Thread: 1\n");
}

return 0;
}

void *thread_func2 (void *var){

for (int i=0; i<5; i++){
printf("Thread: 2\n");
}
return 0;
}
  • 我也尝试过使用 pthread_setschedprio,但仍然无法获得预期的结果。
  • root身份执行程序

在发布这个问题之前,我确实尝试遵循许多帖子/示例,但最终变得更加困惑。任何帮助表示赞赏。

编辑:这不是一个真正的问题吗?我的意思是,如果发布此内容是愚蠢的并且值得投反对票,因为你们中的一些人已经投了反对票,请纠正我?

最佳答案

Expected behavior: Thread which has highest priority (in this case, thread1) should execute first always.

一般来说,Linux 不是这样工作的。底层设计围绕时间共享展开,其中任务的优先级影响该任务获得的 CPU 时间的百分比,并且对延迟或抢占没有影响。它根本不是为了像您想要的那样执行“可以运行的最高优先级任务确实运行(并抢占较低优先级任务)”。

此外:

  • pthread 优先级完全被破坏,几乎所有东西都不支持(除了普通软件不应该使用的实时调度策略,如果您有严格的实时要求,则可能不应该使用)。

  • nice() 也被破坏了,因为它影响单个线程,而不是像预期的那样影响属于整个进程的所有线程。这种破坏意味着,如果您足够勇敢,您可以(在某种程度上)使用 nice() 而不是 pthread 优先级。

  • “优先级”/良好限制的行为(或者至少是,我没有检查它最近是否已修复)也被破坏了;因为无论限制是多少,您都只能降低任务的优先级,而不能将其增加到限制。这完全破坏了几种常见的设计(例如,“工作线程从队列中获取作业,然后调整其优先级以适应该作业”和“线程预先生成对象以供将来使用,然后将其放入池中,并将其优先级调整为满足需求(取决于池的满/空程度)”)。

最终结果是(没有极端的麻烦 - 例如,在内核 splinter 的困惑之上的用户空间线程层)您实际上可以通过滥用“SCHED_RR”来模拟微不足道的“2优先级”系统(加上 nice()(用于微不足道/次要调整)作为高/中优先级,“SCHED_IDLE”作为低优先级。

大部分;最好忘记编写正确使用线程优先级的软件(它太难了,不可移植,并且只提供了它应有的部分好处)。当然,这也是根本问题(因为大多数软件不使用线程优先级,因此内核开发人员并不太关心了解调度程序应该如何工作并且不修复线程优先级,因此大多数软件不使用线程优先级 - 这是一个 self 延续的愚蠢反馈循环,已经持续了 30 年了)。

关于C P线程优先级: Unable to get expected behavior,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58765190/

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