多线程排挤了其他进程

Multithreading crowds out other processes

本文关键字:其他 进程 多线程      更新时间:2023-10-16

我已经为我正在编写的光线追踪器添加了多线程,虽然它现在确实运行得更快,但当它运行时,我的计算机几乎无法使用。显然,我想使用我PC的所有计算能力,但我不希望它阻止任何其他应用程序访问CPU。

我想过让线程睡觉,但除非它们同时睡觉,否则其他线程只会占用额外的时间。此外,如果我不打算使用它,我不一定想放弃一定比例的可用计算能力。

另外,(

这不是我的官方问题)我注意到,由于某种原因,启动的第一个线程比第二个线程做更多的工作,第二个线程比第三个线程做更多的工作,依此类推,直到最后 5 个线程(共 32 个)实际上不会在任何工作中出现裂缝,尽管事实上有很多事情要做(至少有 0.5M 的工作项供他们咀嚼)。如果有人想在评论中冒险猜测,将不胜感激。

如果使用标准线程,则可以尝试使用thread::hardware_concurrency来估计硬件真正支持的最大线程数,以免使CPU过载。

如果返回 0,则信息不可用。 在其他情况下,您可以将自己限制在这个数字或以下一点(认为其他进程也可能使用这些数字)。

如果限制线程数不能提高响应能力,您还可以考虑不时调用this_thread::yield()以提供重新调度线程的机会。 但是,根据您使用的作业和同步类型,第二种选择可能会降低性能。

按照要求,我的评论作为答案:

听起来你已经超额订阅了你可怜的CPU。尝试减少线程数?

如果线程比硬件内核多得多,那么在线程之间切换、在操作系统中调度它们以及争用共享变量将浪费大量时间。这也会导致其他正在运行的程序普遍变慢,因为它们必须与程序中的大量线程(默认情况下,在操作系统调度程序的眼中,这些线程与其他程序的线程具有相同的优先级)。