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.
Üçü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
2) Her bir görev sınıfının zaman maliyeti nedir? Tamamlamak için yaklaşık aynı zamanı mı alıyorlar? – Dialecticus
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