我有一個庫,其中包含一個IJobMaker
實體,該實體創建一定數量的IJob
對象,以便在其自己管理的線程上運行。 要跟蹤每個IJob
的進展情況,我在每個工作中都實施了觀察員模式,並使用IProgressObserver
。當我想彙報總體進展時,就會遇到困難。多線程任務總體進度報告的設計模式
對我來說,理想的做法是讓IProgressOverserver.ReportProgress(float jobProgress, float overallProgress
報告工作和整體進度。 IJobMaker
可以瞭解整個工作的每個工作部分,並以某種方式收集每個人的報告。
兩個主要的問題出現了:
同步機制?例如,在
IJobMaker
內部保留一個互斥體可能會損害性能,因爲IProgressOverserver.ReportProgress
被調用了很多,互斥體可能會導致上下文切換,而不會導致上下文切換。 InterlockedIncrement看起來是個不錯的選擇,但由於沒有這樣的浮點函數,所以我將被迫以整數增量報告進度。 (我想遠離C++ 0x功能或Boost)設計模式?
IJob
的進展是從最深的算法中報告的。我需要每一份這樣的報告都與中央實體進行溝通,以便總體進度計算,並請撥打IJob
中的IProgressObserver.ReportProgress
方法。
你能詳細說明爲什麼它不好使用浮動?另外,我不確定我是否明白你的分類意思。我如何只同步幾個線程? – Leo
花車設計用於各種值。我不認爲你在'1E-200' - '1E200'之間有進展。對於你的情況你可以有'AtomicInteger'並做精確的計算,但是我從來沒有聽說過'AtomicFloat'。是的,你可以將少數幾個線段分組。它允許在單個互斥鎖上同步更少的線程。 – kan
但我必須同步這些細分才能得到最終答案。也許它會起作用,如果我允許一些'IJob'的進展,直到用戶獲得整體進展報告爲止。然而,既然我想要立即回答,我不得不在分段之間和分段之間進行同步,這似乎同樣有害。關於浮點數,我可以有0到1之間的範圍。整數也是很寬的範圍,但只使用一個子範圍。 – Leo