带约束的并发任务执行的设计模式

时间:2010-11-18 20:51:03

标签: multithreading design-patterns concurrency scheduled-tasks

我有三类任务(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中调度任务,等待当前计划任务完成所需。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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);
 }
}