【问题标题】:Priority based multithreading?基于优先级的多线程?
【发布时间】:2018-09-07 02:00:33
【问题描述】:

我为两个线程编写了代码,其中一个线程的优先级为 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;
}

【问题讨论】:

  • 主线程的优先级是多少?
  • 你的意思是 main () ?我只有两个线程。它们不是任何其他线程的子线程。
  • 当要完成的工作超小,你先启动低优先级的线程,它完全有可能在第二个线程启动之前完成它的工作。
  • @immibis:虽然我对此不太确定,但主线程的默认调度是非FIFO 可能意味着它应该立即被低优先级FIFO 线程抢占(虽然显然这没有发生,因为 OP 的结果不一致)。
  • 您的第一条评论更有意义。我将运行一个循环并测试它。

标签: c multithreading thread-priority


【解决方案1】:

我在做任何概念上的错误吗?

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

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

只有时间线程优先级可能会有所不同,因为当存在 CPU 争用时 - 即,想要运行的线程多于可用于运行它们的 CPU 内核。此时,操作系统的线程调度程序必须决定哪个线程将运行以及哪个线程必须等待一段时间。在这种情况下,线程优先级可用于向调度程序指示它应该允许运行哪个线程。

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

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

【讨论】:

  • 这很有意义。但是,有没有一种 Linux 原生的方法可以将其限制为我的 CPU 的一个核心?
  • 我采纳了您的建议并在单核上实现了相同的功能。我不能一次运行 1 个线程,不一定是我想要的优先级。有时优先级较低的线程先运行,有时优先级较高的线程先运行。但是在给定时间只有 1 个线程在运行。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2012-11-17
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多