我为两个线程编写了代码,其中一个被分配优先级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;
}
答案 0 :(得分:1)
我在做任何概念上的错误吗?
是的-您对线程优先级的工作有不正确的期望。线程优先级并不是要强制一个线程在另一个线程之前执行。
实际上,在没有CPU争用的情况下(即,总是至少有与当前要执行的线程一样多的CPU内核可用),线程优先级根本没有任何作用-因为如果有可用的CPU内核,则强制低优先级线程不运行不会有任何好处。在这种无争用的情况下,所有线程将可以同时连续不断地运行,只要它们想要的时间就可以。
仅 时间线程优先级可能会有所不同,那就是存在CPU争用的时间-即,要运行的线程多于可用的CPU内核。到那时,操作系统的线程调度程序必须决定要运行哪个线程,而必须等待一段时间。在这种情况下,可以使用线程优先级来向调度程序指示应该优先允许哪个线程运行。
请注意,这甚至比这还要复杂,例如,在您发布的程序中,两个线程都在调用printf()
,而printf()
会调用I / O,意味着线程可以在I / O(例如,将您的stdout重定向到文件)到I / O(例如,到您的终端窗口或文件)完成后暂时置于睡眠状态。在该线程处于休眠状态时,线程调度程序可以利用现在可用的CPU内核来让另一个线程运行,即使该另一个线程的优先级较低。稍后,当I / O操作完成时,您的高优先级线程将被重新唤醒并重新分配给CPU内核(可能将一个低优先级线程从该内核中“弹出”以获取该线程)。 / p>
请注意,多线程程序的结果不一致是正常现象-线程本质上是不确定的,因为线程的执行模式由线程调度程序的决定确定,而线程调度程序的决定又由许多因素决定(例如,正在运行其他程序)在计算机上显示的时间,系统时钟的粒度等)。