c - 基于优先级的多线程?

标签 c multithreading thread-priority

我已经为两个线程编写了代码,其中一个线程被分配优先级 20(较低),另一个线程被分配优先级 10(较高)。执行我的代码时,70% 的时间我会得到预期结果,即 high_prio(优先级为 10)线程首先执行,然后 low_prio(优先级为 20)。

为什么我的代码在所有执行中都无法获得 100% 正确的结果?我犯了任何概念性错误吗?

void *low_prio(){
    Something here;
}

void *high_prio(){
    Something here;
}

int main(){

    Thread with priority 10 calls high_prio;
    Thread with priority 20 calls low_prio;

    return 0;
}

最佳答案

Is there any conceptual mistake that I am doing?

是的——您对线程优先级的作用有错误的期望。线程优先级并不意味着强制一个线程在另一个线程之前执行。

事实上,在没有 CPU 争用的情况下(即,可用的 CPU 核心数量始终至少与当前要执行的线程数量一样多),线程优先级根本不会产生任何影响——因为当有 CPU 核心可供运行时,强制低优先级线程不运行是没有任何好处的。在这种无争用的场景中,所有线程都将同时连续运行,只要它们愿意。

线程优先级唯一可能产生影响的情况是存在 CPU 争用时,即想要运行的线程数量多于可用于运行它们的 CPU 内核数量。此时,操作系统的线程调度程序必须决定哪个线程将运行以及哪个线程必须等待一段时间。在这种情况下,线程优先级可用于向调度程序指示它应该更喜欢允许运行哪个线程。

请注意,它甚至比这更复杂 - 例如,在您发布的程序中,您的两个线程都调用 printf() 相当多,并且 printf() 调用 I/O,这意味着在 I/O(例如,到您的终端窗口,或者如果您已将 stdout 重定向到文件时到文件)完成时,线程可能会暂时进入休眠状态。当该线程处于休眠状态时,线程调度程序可以利用当前可用的 CPU 核心来让另一个线程运行,即使该另一个线程的优先级较低。稍后,当 I/O 操作完成时,您的高优先级线程将被重新唤醒并重新分配给 CPU 核心(可能将低优先级线程从该核心中“撞出”以获得它)。

请注意,不一致的结果对于多线程程序来说是正常的——线程本质上是不确定的,因为它们的执行模式是由线程调度程序的决策决定的,而线程调度程序的决策又由许多因素决定(例如其他程序正在运行)当时的计算机上、系统时钟的粒度等)。

关于c - 基于优先级的多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52214295/

相关文章:

c++ - win32 程序在 GCC 中编译但不是 G++ HDC 错误

c - 错误读取失败: Success (simple multi-threaded server) c programming

java - 来自具有多个参数的构造函数的类的线程

java - 反射 API 是否会导致同步块(synchronized block)中的竞争条件

c - 在多个 c mex s-function 之间共享数据

c - 如何从C程序中的字符数据类型中检索数值

c# - 数小时后 RAM 密集型 C# 进程变慢

java - java中如何保证一段代码不会被其他线程打断

java - 设置 Java 线程的优先级

java - 缓冲读取器和优先级队列一起工作?