【问题标题】:Is it possible to disable context switching of a specific thread?是否可以禁用特定线程的上下文切换?
【发布时间】:2022-10-17 10:00:04
【问题描述】:

我正在研究 Linux 系统中的多线程 c/c++ 程序。目前,一种设计可能需要我创建多个 pthread(比如 100 个),并且每个处理一个任务。但是,我希望 CPU 内核可以在切换到另一个任务之前完成一个 pthread 任务。例如,如果我可以为我的程序分配 8 个 CPU 内核并创建 16 个 pthread,我希望它们在前 8 个 pthread 上工作,直到点击 cv_wait() 或返回点并切换到另一个 pthread。有没有高效的在当前 pthread 调用 cv_wait() 之前禁用一个特定 CPU 线程的上下文切换的方法?
为每个任务创建一个cv 并将它们放入队列中可能会起作用,但这可能会产生过多的开销。

【问题讨论】:

  • 您无法细粒度地控制用户空间中线程的调度。不过,您可以控制线程的亲和性。通常,由于系统调用,与 OS 调度程序的任何关系都趋于缓慢。为什么不使用自己的应用程序级调度创建一个线程池。此外,如果需要,您可以重复使用条件变量。没有理由拥有比线程数更多的条件变量 AFAIK。
  • 适用于 Linux 且仅适用于 Linux;如果您有 8 个 CPU,则可以考虑使用 SCHED_OTHER 使用 8 个线程,使用 SCHED_IDLE 使用 8 个线程。在这种情况下,调度程序将尽可能将 CPU 时间分配给 SCHED_OTHER 线程(如果 SCHED_OTHER 线程/s 被阻塞/等待,则仅将 CPU 时间分配给 SCHED_IDLE 线程)。

标签: c linux multithreading operating-system pthreads


【解决方案1】:

听起来您可能想要SCHED_FIFO 实时调度类。此类中的线程不会被具有相同线程优先级的其他线程抢占 - 它们仅在自愿屈服或被阻塞(包括在互斥锁上阻塞,条件)时移动到运行队列的底部(对于该静态线程优先级)变量、IO 等)。

然而,一个更好的设计可能具有较少数量的线程(每个 CPU 内核一个或两个),每个线程按顺序处理多个工作单元,而不是每个工作单元一个线程。这在更多工作项之间分摊了线程启动成本,并且通常更有效。然后,您可以使用普通的调度类而不必担心上下文切换,因为您的线程被编写为在移动到下一个工作项之前完全处理一个工作项。

【讨论】:

  • 回复,“......运行队列的底部......”您可能会指出,有效,每个优先级一个运行队列。当 CPU 时间发生争用时,具有较高优先级的 SCHED_FIFO 线程总是会在较低优先级的线程之前运行,即使较低优先级的线程等待的时间更长。您可能还指出,“睡眠”不仅意味着 sleep() 等。线程在等待互斥锁或条件变量、等待任何 IPC 对象、等待阻塞 I/O 调用等时也会“自动休眠”。
  • 确实如此,通常我们应该考虑让每个线程在多个工作负载上重复运行。但是由于某些特定的原因,这需要相当多的工作来改变原始的代码结构。因此,我只是在寻找可能的更简单的解决方案。非常感谢您的回答!
猜你喜欢
  • 2011-07-23
  • 2013-07-15
  • 1970-01-01
  • 2017-09-09
  • 2011-07-27
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多