2011-04-13 230 views
1

我正在編寫一個多線程C++應用程序。當線程A執行的計算開銷很大時,它會減慢線程B,C和D.如何防止這種情況發生?C++多線程執行速度減慢

+0

你的系統有多少核心?如果你的內核少於4個,那麼一些內核將不得不在多個線程中共享,這意味着一個線程的成本會影響其他線程...... – 2011-04-13 14:58:16

+0

我有4個內核。這是一個英特爾i7。 – rossb83 2011-04-13 15:04:56

+2

4核心和一個線程減慢其他?要麼你測量不正確或者線程在邏輯上相互鎖定(也就是說,這不是計算時間減慢)。因此,「睡眠」可能無濟於事。 – 2011-04-13 15:47:08

回答

2

在窗口上,您可以使用Sleep(0)爲正在等待的其他線程釋放剩餘的時間片。

+0

這也是POSIX語義 – sehe 2011-04-13 14:52:04

+0

這是我建議 - _but_會減慢線程A,所以不應該使用,如果計算是時間關鍵的 – tom502 2011-04-13 14:52:41

+0

鑑於他有4個核心,它是不可能的一個線程的CPU開銷讓其他人放慢速度,這樣「睡眠」實際上會有所幫助。他可能有一些不好的鎖定語義。 *虛假分享也是可能的,但在性能測試中很難注意到* – 2011-04-13 15:54:33

0

很難說沒有看到代碼,所以我只能給你建議降低線程A的優先級。這可以使用SetThreadPriority函數完成。

0

請注意,您可以設置線程優先級(SetThreadPriority

另外,我建議BackgroundWorker的挑選它從隊列中的工作。那麼隊列可以作爲一種方法來節流算了一筆賬:

  • 可以配置多少「任務」是從隊列進行處理採取一舉
  • 可以鎖定隊列(使用信號燈+條件事件),因此您可以暫時阻止拾取新任務。
  • 您現在可以分發跨多個作業者的負擔(比如如果線程B,C,d是暫時閒置的,他們可以開始解除勞動關閉線程A;在一個四核+桌面非常有用)

$ 0.02

+0

增加了更多的建議 – sehe 2011-04-13 14:56:06

0

有幾種方法:

  • 作爲RedX建議,在線程A的內部循環添加Sleep(0)有它產生的時間更頻繁。這是便宜和懶惰的解決方案。
  • 更好的辦法是改變線程的優先級。當您撥打CreateThread時,請通過CREATE_SUSPENDED,以便線程不會立即啓動。然後致電SetPriorityClass將線程設置爲較低的優先級,然後是ResumeThread
+0

優先級較低時也會被其他系統進程中斷。通過睡眠(0),您仍然可以爲您的所有線程設置高優先級,並使用Sleep將剩下的時間用於這些線程。 (希望這是有道理的) – RedX 2011-04-13 15:04:00

+0

@RedX,你的評論是錯誤的。當你睡眠(0)時,當前正在執行的線程被掛起,但是絕對不能保證下一個要運行的線程來自你的進程。所以你可能會以任何方式讓系統線程產生時間。 – 2011-04-13 15:06:55

0

您可能還想看看讓您的計算綁定線程將處理器交給其他線程。請參閱this post以瞭解執行此操作的各種方法。