【发布时间】: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