2012-03-08 13 views
9

Konular arasında paylaşılan bir Control.Concurrent.Chan ile eşzamanlı bir sistem kurmalıyım. Sadece bir tüketici ve bir çok üretici olacak. Chan documentation'a baktığımda Aynı kanalda çalışabilecek tüketici ve üretici sayısı hakkında herhangi bir uyarı görmedim ve kaynak kodu MVar s için varsayılan "güvenli" erişim sağlayıcıları kullanıyor gibi görünüyor, bu yüzden Sınırlamalar olmamalı, ancak emin değilim. Öyleyse, sorum şu ki ... haskell kanallarının çoklu okuyucu ve üreticiler için (genel olarak) güvenli olup olmadığını biliyor musunuz, lütfen?Çok sayıda okuyucu/üretici için "Control.Concurrent.Chan" güvenli kanallar var mı?

cevap

11

İstenilen sayıda diş için güvenlidir. Basit bir MVar tabanlı bağlantılı liste. Tasarım satışları, birden fazla okuyucuya karşı yayın durumunda yardımcı olan dupChan'e izin verir.

Chan çok basittir, içerideki öğe sayısını saymaz ve üst sınırı yoktur. Yani eğer üreticiler tüketiciyi aşarsa, Chan çok büyük olur. Eğer bu bir problemse, Chan'ı bir (MVar Int) ile eşleştirebilirsiniz. ve üreticilerin ve tüketicilerin Chan'daki işlerin toplamını değiştirmelerini sağlayın.

+0

İyi, teşekkürler. Bir üst sınırın yokluğu benim durumumda sorun değil, çünkü her iş parçacığı tamamlandıktan sonra bir ve bir mesaj gönderecektir. Devam etmeden önce ana mesaj dizisini N mesajları için beklemek için kullanacağım basit bir yapı (eğer N sayısı iplik sayısı ise). –

+0

Bunun gibi sayılan bir bariyer bir miktar semafor gibi görünür, Chan'ın bağlı liste uzunluğunu (1-N) başlangıç ​​miktarı kullanılarak http://hackage.haskell.org/package/SafeSemaphore adresinde MSem veya MSemN ile değiştirebilirsiniz. –

+0

Haskell platformundaki semaforları bilmiyordum, işaret ettiğin için çok teşekkür ederim. Kanalları kesinlikle onlarla değiştireceğim. –