基于优先级的多线程?

Priority based multithreading?

我为两个线程编写了代码,其中一个线程的优先级为 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 核心可用),线程priorities 根本没有影响——因为当有一个 CPU 内核可用于 运行 时,强制低优先级线程不 运行 没有任何好处。在这种无争用的情况下,所有线程都将同时并连续地到达 运行,只要他们愿意。

时间线程优先级可能会有所不同,因为存在 CPU 争用 - 即有更多线程想要 运行有 CPU 个内核可供 运行 他们使用。那时,OS 的线程调度程序必须决定哪个线程将到达 运行 以及哪个线程必须等待一段时间。在这种情况下,线程优先级可用于向调度程序指示它应该更愿意允许哪个线程 运行.

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

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