2012-03-08 22 views
9

Tôi cần đặt cùng một hệ thống đồng thời với một hệ thống được chia sẻ Control.Concurrent.Chan giữa các chuỗi. Sẽ chỉ có một người tiêu dùng và nhiều nhà sản xuất. Nhìn vào Chan documentation Tôi không thấy bất kỳ cảnh báo nào về số lượng người tiêu dùng và nhà sản xuất có thể hoạt động trên cùng một kênh và mã nguồn dường như đang sử dụng trình truy cập "an toàn" mặc định cho MVar s. an toàn để giả định rằng không nên có giới hạn nhưng tôi không chắc chắn. Vì vậy, câu hỏi của tôi là ... bạn có biết liệu các kênh haskell có an toàn (nói chung) cho nhiều độc giả và nhà sản xuất không?Các kênh haskell `Control.Concurrent.Chan` có an toàn cho nhiều độc giả/nhà sản xuất không?

Trả lời

11

Chúng an toàn cho bất kỳ số lượng chủ đề nào. Họ là một danh sách liên kết dựa trên MVar đơn giản. Các thương mại thiết kế-off cho phép dupChan giúp trong trường hợp ngược lại của phát sóng cho nhiều độc giả.

Chân rất đơn giản, nó không tính số mục bên trong, cũng như không có giới hạn trên. Vì vậy, nếu các nhà sản xuất vượt xa người tiêu dùng thì Chan sẽ trở nên rất lớn. Nếu đây là một vấn đề sau đó bạn có thể ghép Chan với một (MVar Int). và có các nhà sản xuất và người tiêu dùng sửa đổi tổng số mục đang chạy trong Chan.

+0

Tốt, cảm ơn. Sự vắng mặt của một ràng buộc trên không phải là một vấn đề trong trường hợp của tôi bởi vì mỗi thread sẽ gửi một và chỉ một tin nhắn, sau khi hoàn thành. Đó là một cấu trúc đơn giản mà tôi sẽ sử dụng để làm cho chủ đề chính chờ đợi cho các tin nhắn N (nếu N là số lượng chủ đề) từ kênh trước khi tiếp tục. –

+0

Một hàng rào được tính như thế này trông giống như một semaphore số lượng, bạn có thể thay thế chiều dài danh sách liên kết của Chan bằng MSem hoặc MSemN trong http://hackage.haskell.org/package/SafeSemaphore bằng cách sử dụng số lượng ban đầu là (1-N). –

+0

Tôi không biết về semaphores trong nền tảng haskell, cảm ơn bạn rất nhiều vì đã chỉ ra nó. Tôi sẽ thay thế kênh với họ chắc chắn. –