我有一个包含两个线程的进程。我想根据他们的 priority(SCHED_RR policy)
安排他们。设 t1、t2 表示这些线程,它们最初都具有优先级 1(最低)。
我想确保我的线程 t1 在执行关键任务时不会被抢占/重新安排 - 所以我在关键任务之前将其优先级提高到最大值,并在关键任务之后将其降低到原始值:
thread_proc_t1() {
while(1) {
if(critical condition happens) {
set_priority_max();
}
printf("t1");
usleep(xxx);
if(critical task finished ) {
reset_priority();
}
}
}
thread_proc_t2() {
while(1) {
printf("t2");
usleep(xxx);
}
}
我希望在线程 t1 中调用 set_priority_max()
后线程 t2 中的 printf()
命令不会执行。但是输出确实也包含来自线程 t2 的打印。
为什么会这样?
我该如何解决这个问题?
最佳答案
没问题,这是预期的行为。
首先,如果您有多个内核,那么即使准备运行的线程比内核少,优先级也无关紧要——每个线程都将获得自己的内核。
其次,您的高优先级线程休眠,这为低优先级线程提供了运行时间。
第三,您的线程通过保护标准输出的锁进行交互。优先级较高的线程可以等待该锁,从而允许优先级较低的线程运行。
请不要尝试以这种方式使用优先级。它添加了 massive complexity ,会影响性能,并且很少完成任何有用的事情。
关于linux - 基于优先级的线程(不是进程)调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13820905/