2

Bir sıraya giren 3 sınıf görevi (I, D, U) var, aynı sınıfın görevleri sırayla işlenmelidir. Görevlerin mümkün olduğunca eş zamanlı çalışmasını istiyorum; ancak bazı kısıtlamaları vardır:Sınırlamalar ile eşzamanlı görev yürütme için tasarım deseni

  • U ve D aynı anda
  • U çalıştıramaz ve eş zamanlı olarak çalıştırılamaz
  • (n)

S tamamlandı (n) U gerektirir: Bu tasarım sınıfı hangi sorunlara uygun olabilir?

Yaklaşım 1: Görev başına kullanın 1 Konu, kendi kuyruğuna her

ben düşünüyorum iki yaklaşımı var. Her bir iş parçacığı, başlangıç ​​koşullarını kontrol ettiği ve ardından senkronize bir durdurma fazının çalıştığı senkronize bir başlangıç ​​fazına sahiptir. Bunun iyi bir eşzamanlılık sağlayacağını görmek kolaydır, ancak kısıtlarımı doğru uygulayıp uygulamaması ve çıkmaza girmemesi konusunda emin değilim.

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

yaklaşım 2: Alternatif olarak, tek gönderme iplik şu anda planlanmış görevler için gerekli tamamlamak için ise bekleyen bir ThreadPool'da çalışma durumunu yönetir ve zamanlamaları görevleri.

+0

Üçüncü kısıt daha açar mısınız: Bir muteks ağırlıklı tabi hepsi bu? Ben ve U çiftler halinde gelirler ve her biri eşleştirilmiş U'ya ihtiyaç duyar veya böyle bir çift yoktur, ancak tamamlanmış I'lerin sayısı tamamlanmış U'ların sayısından fazla olamaz mı? Veya başka bir şey? – Dialecticus

+0

2) Her bir görev sınıfının zaman maliyeti nedir? Tamamlamak için yaklaşık aynı zamanı mı alıyorlar? – Dialecticus

+0

Her ikisinden de biraz. U (n) bir çeşit önbellek boşluğudur, U (n-1) U (n-2) ... ve benzeri anlamına gelir; Bu sayede aynı anda birden fazla işlemi yapmak mümkün. Her işlem onunla ilişkili bir pozisyona sahiptir; D (k) aslında U (k) için bir gereksinim yaratır. Örnek olarak kastedildiler; İnsanların bu problemi tamamen çözmelerini istemiyorum; sadece bazı tasarım desenleri öneriyoruz. – Justin

cevap

1

Objective-C Foundation çerçevesi, bu gereksinimlerin bazılarını karşılayan NSOperationQueue ve NSOperation sınıflarını içerir. NSOperationQueue, NSOperation s sırasını temsil eder. Sıra, aynı anda yapılandırılabilir maksimum sayıda işlem gerçekleştirir. Operasyonların bir önceliği ve bir bağımlılıklar kümesi vardır; Bir işlemin bağlı olduğu tüm işlemler, sıra, işlemi çalıştırmaya başlamadan önce tamamlanmalıdır. İşlemlerin dinamik boyutlu bir havuz havuzunda çalışması planlanıyor.

Eğer ifade ettiler kısıtlamaları uygular NSOperationQueue bir miktar daha akıllı sürümünü gerektirir gerekenler

ancak NSOperationQueue ve şirket Sorununuz gönderilme ikinci önerilen çözüm benzeyen bir üretim çerçevesinde çözülmüştür nasıl kabaca bir örnek sunmak Bir iş parçacığı havuzu üzerinde görevler çalıştıran iş parçacığı.

+0

NSOperationQueue, bağımlı bir asiklik bağımlılık grafiğini ve başka bir sonuç beklemeyen her şeyi planlamak için sınırlı bir iş parçacığı havuzu kullanıyor gibi görünüyor. – Justin

+0

Kısıtlamalarımı ileriye dönük bağımlılıklar açısından ifade etmenin bir yolunu göremedim. – Justin

+0

Bunu alacağım, bu problemi çözmüyor ama istediğim buydu. – Justin

0

Aslında bu görünüyordu daha basit olduğu ortaya çıkıyor:

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); 
} 
} 
İlgili konular