我有一个包含两个线程的进程。我想根据他们的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中调用printf()
之后,不会执行线程t2中的set_priority_max()
命令。但输出确实包含来自线程t2的打印。
为什么会这样?
我该如何解决这个问题?
答案 0 :(得分:2)
没有问题,这是预期的行为。
首先,如果你有多个核心,那么如果准备运行的线程少于核心,优先级将无关紧要 - 每个线程都将获得自己的核心。
其次,您的高优先级线程会休眠,这会使优先级较低的线程有时间运行。
第三,您的线程通过保护标准输出的锁进行交互。优先级较高的线程可以等待该锁定,允许较低优先级的线程运行。
请不要试图以这种方式使用优先级。它增加了massive complexity,伤害了性能,很少完成任何有用的事情。