2014-11-21 50 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()以提供重新計劃線程的機會。但取決於您使用的作業類型和同步方式,第二種選擇可能會降低性能。