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

标签 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 中调用 set_priority_max() 后线程 t2 中的 printf() 命令不会执行。但是输出确实也包含来自线程 t2 的打印。

  1. 为什么会这样?

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

最佳答案

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

首先,如果您有多个内核,那么即使准备运行的线程比内核少,优先级也无关紧要——每个线程都将获得自己的内核。

其次,您的高优先级线程休眠,这为低优先级线程提供了运行时间。

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

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

关于linux - 基于优先级的线程(不是进程)调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13820905/

相关文章:

c# - 是否有任何等效于使用 C# 限制对一个线程的访问的访问修饰符?

python - 从服务器上运行的 python 线程将数据推送到远程客户端

loops - 是什么导致空的 Go for 循环锁定程序?

c - 在 Linux 内核模块(驱动程序)临界区等待用户空间输入

Java 同步并发生在之前

power-shell 脚本的 Windows 调度不可靠

algorithm - 作业车间调度 - 类项目 - 关于引用/算法的建议。用于实现和获得实验结果

linux - 我怎样才能用引号和 colopn grep 字符串

C# .NET Core Console.ReadKey(true) 不会(总是)拦截 Ubuntu 上的 key

c++ - 当我使用线程时,Breakpad 无法在目标上创建小型转储