2

キューに入っているタスク(I、D、U)のクラスが3つあり、同じクラスのタスクを順番に処理する必要があります。できるだけ同時にタスクを実行したい。しかし、いくつかの制約があります。制約付き並列タスク実行の設計パターン

  • UとDが同時に
  • Uを実行することはできませんし、私は同時に実行することはできません
  • I(n)は

Q完了した(N)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

あなたは第三の制約上、より詳しく説明してもらえますか? IとUは対になっていて、それぞれが対になったUを必要とするか、そのような対は存在しませんが、完成したIの数は完成Uの数よりも大きくすることはできませんか?または、他の何か? – Dialecticus

+0

2)各クラスの時間コストはどのくらいですか?完了するまでにほぼ同じ時間がかかりますか? – Dialecticus

+0

両方のビット。 U(n)は一種のキャッシュであり、U(n-1)U(n-2)を意味する。すぐに複数のプロセスを処理することが可能です。各操作には、関連する位置があります。 D(k)は実際にU(k)の要件を生成する。それらは例として意味されていた。私は人々にこの問題を完全に解決するよう求めているわけではありません。いくつかのデザインパターンをお勧めします。 – Justin

答えて

1

Objective-C Foundationフレームワークには、これらの要件のいくつかを満たすクラスNSOperationQueueおよびNSOperationが含まれています。 NSOperationQueueは、NSOperationのキューを表します。キューは、構成可能な最大数の操作を同時に実行します。操作には優先順位と依存関係があります。キューが操作の実行を開始する前に、操作が依存するすべての操作を完了する必要があります。操作は、動的にサイズの変更されたスレッドプールで実行されるようにスケジュールされています。あなたが必要なもの

は、あなたが表明している制約を適用するNSOperationQueueのやや賢くバージョンを必要としますが、NSOperationQueueと会社があなたの問題が派遣の2番目の提案ソリューションに似た生産体制で解決されているか大体の例を提供しますスレッドプール上でタスクを実行しています。

+0

NSOperationQueueは、依存関係の有向非循環グラフと有界スレッドプールを使用して、別の結果を保留していないものすべてをスケジュールするようです。 – Justin

+0

フォワード依存性に関して私の制約を表現する方法が見えませんでした。 – Justin

+0

私はそれを取る、これは問題を解決しませんが、それは私が尋ねたものです。 – Justin

0

実は、これはそれが見えたよりも、よりシンプルであることが判明:mutexは主に必要とされるすべてである:

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); 
} 
} 
関連する問題