我有三类任务(I,D,U)进入队列,必须按顺序处理同一类的任务。我希望任务尽可能同时运行;但是有一些限制:
问:哪种设计模式适合这类问题?
我正在考虑两种方法:
方法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中调度任务,等待当前计划任务完成所需。
答案 0 :(得分:1)
Objective-C Foundation框架包括满足其中一些要求的类NSOperationQueue
和NSOperation
。 NSOperationQueue
代表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);
}
}