1

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

我希望printf()线程 t2 中的命令在我调用set_priority_max()线程 t1 后不会被执行。但输出也包含来自线程 t2 的打印。

  1. 为什么会这样?

  2. 我怎么解决这个问题?

4

1 回答 1

2

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

首先,如果你有多个核心,那么如果准备运行的线程比核心少,那么优先级就无关紧要了——每个线程都会有自己的核心。

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

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

请不要尝试以这种方式使用优先级。它增加了巨大的复杂性,损害了性能,并且很少完成任何有用的事情。

于 2012-12-11T12:58:57.353 回答