基于优先级的线程(不进程)调度

时间:2012-12-11 12:56:40

标签: linux multithreading scheduling thread-priority

我有一个包含两个线程的进程。我想根据他们的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的打印。

  1. 为什么会这样?

  2. 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

没有问题,这是预期的行为。

首先,如果你有多个核心,那么如果准备运行的线程少于核心,优先级将无关紧要 - 每个线程都将获得自己的核心。

其次,您的高优先级线程会休眠,这会使优先级较低的线程有时间运行。

第三,您的线程通过保护标准输出的锁进行交互。优先级较高的线程可以等待该锁定,允许较低优先级的线程运行。

请不要试图以这种方式使用优先级。它增加了massive complexity,伤害了性能,很少完成任何有用的事情。