我有一个库,其中包含一个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