【问题标题】:design pattern for concurrent task execution with constraints具有约束的并发任务执行的设计模式
【发布时间】:2011-05-12 07:01:19
【问题描述】:

我有 3 类任务(I、D、U)进入队列,同一类的任务必须按顺序处理。我希望任务尽可能同时运行;但是有一些限制:

  • U 和 D 不能同时运行
  • 你和我不能同时运行
  • I(n) 要求 U(n) 已完成

问:什么设计模式适合这类问题?

我正在考虑两种方法:

方法 1: 每个任务使用 1 个线程,每个任务都有自己的队列。每个线程都有一个同步启动阶段,它检查启动条件,然后运行,然后是一个同步停止阶段。很容易看出这将提供良好的并发性,但我不确定它是否正确实现了我的约束并且不会死锁。

D_Thread { ...
 while (task = D_Queue.take()) {
  synchronized (State) {   // start phase
   waitForU();
   State.setRunning(D, true);
  }
  run(task);  // run phase
  synchronized (State) {   // stop phase
    State.setRunning(D, false) 
  }
 }
}

方法 2: 或者,单个调度线程管理执行状态,并在 ThreadPool 中调度任务,并在必要时等待当前调度的任务完成。

【问题讨论】:

  • 您能否详细说明第三个约束? I 和 U 是成对出现的,每个 I 都需要成对的 U,还是没有这样的对,只是完成的 I 的数量不能大于完成的 U 的数量?还是别的什么?
  • 2) 每类任务的时间成本是多少?它们需要大约相同的时间来完成吗?
  • 两者兼而有之。 U(n) 是一种缓存刷新,它意味着 U(n-1) U(n-2) ... 等等;因此可以一次处理多个。每个操作都有一个与之关联的位置;所以 D(k) 实际上为 U(k) 创建了一个需求。它们只是作为例子;我不是要求人们完全解决这个问题。只是推荐一些设计模式。

标签: multithreading design-patterns concurrency scheduled-tasks


【解决方案1】:

Objective-C Foundation 框架包括满足其中一些要求的类NSOperationQueueNSOperationNSOperationQueue 表示 NSOperations 的队列。队列同时运行可配置的最大操作数。操作有一个优先级和一组依赖关系;一个操作所依赖的所有操作必须在队列开始运行该操作之前完成。这些操作计划在动态大小的线程池上运行。

您需要一个更智能的NSOperationQueue 版本来应用您所表达的约束,但是NSOperationQueue 和公司提供了一个示例,说明您的问题在类似于您的第二个建议解决方案的生产框架中得到了怎样的粗略解决在线程池上运行任务的调度线程。

【讨论】:

  • 看起来 NSOperationQueue 使用了一个有向无环依赖关系图和一个有界线程池来调度所有不等待另一个结果的东西。
  • 我看不到用前向依赖项来表达我的约束的方法。
  • 我会接受的,这并不能解决问题,但这是我要求的。
【解决方案2】:

实际上这比看起来更简单:互斥锁主要是所需要的:

IThread(int k) {
 synchronized (u_mutex) {
  if (previousUSet.contains(k))) U(k);
 }
 I(k);
}

DThread(int k) {
 synchronized (u_mutex) {
  D(k);
  previousUSet.add(k);
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2011-08-23
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多