2012-06-01 11 views
7

Tüketicilerin bir ağacın her seviyesinde bir miktar çalışma yaptıkları, daha sonra ağaca tekrar girmeleri ve aynı işi bir sonraki aşamada gerçekleştirmeleri gerektiği bir sorun var.Üreticiler ayrıca tüketiciler olduğunda Üretici/Tüketici modelindeki engelleme kodunu nasıl kullanırım? - Nasıl sona ererim?

Paralel olarak çalıştırmak için ConcurrentBag/BlockingCollection vb. Kullanmak istiyorum. Bu senaryoda, sıra tüketiciler, aynı zamanda kuyruk üreticisidir!

Sorunum şudur: BlockingCollection'ı kullanarak, öğelerin dequeue için çok basit bir foreach mantığı yazabilirim ve yeni olanları sıralayabilirim - Sıra boş olduğunda, engelleme koleksiyonu doğru bir şekilde tıkanır ve yeni işlerin üretilmesini bekler. diğer tüketicilerden biri.

Ancak tüm tüketicilerin engellenip engellemediğini nasıl bilebilirim ?!

CompleteAdding() hakkında bir şey biliyorum, ancak bu, tam olarak tamamlandığınız zaman, tüm üreticilerin üretildiği ve kuyruğun boş olduğu ve bunların hepsinin engelleneceğinden dolayı sunulmayacağı anlamına gelmez. CompleteAdding() öğesini ayarlamak için "ücretsiz" kimse yoktur. Bunu tespit etmenin bir yolu var mı? (Engelleme sırasında tetiklenebilecek bir olay ve engellemediğinde yeniden ateş açabilecek bir olay var mı?)

Bunu elle, bir foreach kullanmadan, ancak bir süre (! Complete) döngüsünü kullanarak ve TryTake kullanarak elle yapabilirim, ancak o zaman el ile uyumaya ihtiyacım var, bu da verimsiz gibi görünüyor (ilk etapta sadece eşzamanlı koleksiyonlara karşı tıkanıklık koleksiyonuna sahip olmanın tüm nedeni!) Her zaman döngüde, TryTake yanlışsa, bir Boşta bayrağı ayarlayabilirdim ve kuyruk boşsa ve tüm iş parçacığı boşsa bir Ana kontrol var, tam bir bayrak ayarla, ama yine, bu kludgy görünüyor.

Sezgiler, bunu yapmak için Engelleme Koleksiyonu'nu kullanmanın bir yolunun olduğunu söylüyor, ancak oraya tam olarak ulaşamıyorum.

Neyse, herkes tüketiciler üreticileri ve tüm bloklar MSDN'den bu bağlantıyı size yardımcı olabilir bence

+1

İyi soru. Dış bayraklar veya olaylarla ilgili her şey yarış koşulları için olgunlaşmış görünüyor. –

+0

İşlemciler (kombine tüketiciler/üreticiler) çok fazla devlete sahipler veya çok fazla kaynak istiyorlar mı? Sorunu, her biri sadece bir yineleme yapmak olan Görevler oluşturma açısından yeniden atabilir misiniz? –

+0

@Damien_The_Unbeliever: Evet, tek yineleme yapabilirim ve aslında zaten çalışıyor, ancak üretici/tüketici modelini kullanmaya çalışıyorum, çünkü bu, gelecekteki bulutta geçirilebilecek koddur. Azure Kuyruğu deposunu aynı şekilde kullanarak, genel mantığı iki uygulama arasında olabildiğince benzer tutmak isterim. Bu senaryoda, İşçilerin sıraya gireceğine karar vermek için boşta olup olmadıklarını kontrol etmek zorunda kalacağım, ancak yerel olarak mümkün olduğunca verimli olmalıyım - aynı zamanda bunu anlamak istiyorum :) –

cevap

-3

harika olurdu serbest bırakmak için bunu algılamak mümkün olduğunda iyi bir desene sahiptir.

Reusable Parallel Data Structures and Algorithms

Eşzamanlı senaryolarda bazı veri yapıları nasıl başa ortaya çıkarır.

+1

2007'den veri yapıları, 4.0 eşzamanlı kitaplıklar hakkındaki sorumu ele almazlar –

+0

4.0'ı kullanarak kendiniz uygulayın. Bu sadece bir rehber, "cevap" değil. – oarrivi

İlgili konular