2014-11-21 77 views
0

我已将多线程添加到正在写入的光线跟踪器中,虽然现在运行速度更快,但在运行时,我的计算机几乎无法缓慢运行。显然,我想使用我所有的PC的计算能力,但我不希望它阻止任何其他应用程序访问CPU。多线程挤出其他进程

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

另外,(这不是我的官方问题)我注意到,由于某种原因,第一个线程比第二个线程执行更多的工作,第二个比第三个多,等等,直到像最后5个线程(32人中的任何一人)在任何工作中实际上都不会受到任何伤害,尽管有很多事情要做(至少有50万个工作项目供他们咀嚼)。如果有人想冒险评论的话,我们将不胜感激。

+1

听起来你已经超额订购了你可怜的CPU。尝试减少线程的数量? – Cameron 2014-11-21 22:24:46

+1

您可以降低程序的优先级。你的操作系统是什么? – indiv 2014-11-21 22:29:39

+0

@Cameron这似乎是它的伎俩!我将线程数减少到了6,现在响应速度已恢复正常,而且我的帧定时实际上略有下降(此外,跨线程的工作负载似乎现在已经达到平衡)。我的印象是更多的线程不会受伤,但显然这是不正确的。如果你想创建一个答案,我会接受它。 – user2345397 2014-11-21 22:38:44

回答

1

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

这听起来像你已经超额你可怜的CPU。尝试减少线程的数量?

如果线程明显多于硬件内核,那么很多时候会浪费线程之间的切换,在OS中调度它们以及争用共享变量。这也会导致其他正在运行的程序的普遍减速,因为它们必须与来自程序的大量线程竞争(默认情况下,所有线程都具有与OS调度程序眼中的其他程序线程相同的优先级) 。

2

如果使用标准的线程,你可以尝试使用thread::hardware_concurrency找出线程maximul数是不是真正的硬件支持的估计,为了不使你的cpu。

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

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