【问题标题】:Thread (not processes) scheduling based on priority基于优先级的线程(不是进程)调度
【发布时间】:2012-12-11 12:56:40
【问题描述】:

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

  1. 为什么会这样?

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

【问题讨论】:

    标签: linux multithreading scheduling thread-priority


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。现在我理解了代码中的错误。我如何使我的线程不会被抢占/重新安排?
    • 你不能。你为什么想要?想象一下,如果只有一个核心并且线程需要另一个线程持有的锁。如果它没有被抢占或重新安排,你将永远陷入僵局。我不知道在哪里,但是您似乎对线程的全部意义或调度程序和应用程序开发人员之间的责任划分存在误解。这是正确的方法:如果您不希望线程执行某项操作,请不要编写代码来执行此操作。如果你总是宁愿做 A 而不是 B,那么让你的代码做 A 而不是 B。
    • 谢谢。这是对 vxworks(taskLock) 中的 API 的疑问 - 它用于锁定任务(在 vxworks 中)以进行抢占
    • 即使taskLock 也不会做你声称想做的事情。例如,如果线程休眠,操作系统将进行上下文切换。像taskLock 这样的东西在现代通用计算机上是没有位置的。如果您描述了您的用例,我可以告诉您在通用操作系统上执行此操作的正确方法。
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2011-12-02
    • 2012-07-10
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多