多线程任务总体进度报告设计模式

我有一个库IJobMaker创建的一定量的实体IJob物体被由用户管理他们自己的线程中运行。 要跟踪每个IJob的进步我实现与观察者模式IProgressObserver每一项工作中。 当我谨总体进度报告中出现的困难。

理想对我来说将是有IProgressOverserver.ReportProgress(float jobProgress, float overallProgress这两个报告工作,全面进步。 IJobMaker可以知道整个工作的每个岗位的部分并以某种方式收集每个人的报告。

两个主要的问题出现:

  1. 同步机制? 保持一个互斥体IJobMaker因为例如可能会损害性能IProgressOverserver.ReportProgress被调用了很多,一个互斥体可能会招致上下文切换,什么不是。 InterlockedIncrement看起来像一个不错的选择,但因为有浮点没有这种功能,我将被迫整数递增报告进度。 (我想从C ++ 0x特性的升压或远离)
  2. 设计模式? IJob的进步是从最深的算法中的报道。 我需要每一个这样一份报告,都与整体进度计算中央实体沟通,并调用IProgressObserver.ReportProgress驻留在方法IJob

--------------解决方案-------------

首先,这是相当不好的做法在这样的情况下使用花车。 使用一个整数。

还有一种建议。 您可以使用分段 - 一个互斥/原子(一段)只同步线程数。 然后收集各阶层总。

此外,还有良好的开端环顾四周高度并行算法:http://www.1024cores.net/home/lock-free-algorithms

UDPATE有例子的与浮子问题

#include <iostream>
using namespace std;
int main() {
float f = 0;
for(int i=0; i<100000-98; ++i)
{
f += 0.00001;
}
cout << f << endl;
}

所以,如果你有100个职位1000每个步骤,你将有1.0结果98比你早可预期。

一对夫妇在穿线前的建议:

  1. 不报告进度每一个哪怕一丁点。 一旦一个进步的特定的预定量已取得,或在一定的时间预定量已过,或副作业完成只到主线程报告。 这可以大大减少同步的量。
  2. 如果您实现#1,一个互斥体可能会工作得很好。
  3. 如果互斥锁原来是太贵了,你可以用原子整数变量报告进展情况:单纯从“没有任何进展”缩放值“全部完成”,以0 ... INT_MAX

至于设计的API,它应该不会太困难要拿出东西明智的。 我一般建议是不overengineer它。

分类:C# 时间:2015-03-14 人气:0
本文关键词: 设计模式,多线程
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.913 (s). 10 q(s)