Безопасны ли каналы haskell `Control.Concurrent.Chan` для нескольких читателей / производителей? - PullRequest
9 голосов
/ 08 марта 2012

Мне нужно собрать параллельную систему с одним общим Control.Concurrent.Chan между потоками. Будет только один потребитель и много производителей. Глядя на документацию Chan Я не увидел никаких предупреждений о количестве потребителей и производителей, которые могут работать на одном и том же канале, и в исходном коде, по-видимому, используются стандартные безопасные средства доступа для MVar s, поэтому я думаю, что можно с уверенностью предположить, что не должно быть ограничений, но я не уверен. Итак, мой вопрос ... знаете ли вы, являются ли каналы haskell безопасными (в целом) для нескольких читателей и производителей, пожалуйста?

1 Ответ

11 голосов
/ 08 марта 2012

Они безопасны для любого количества потоков. Это простой связанный с MVar список. Компромиссные решения позволяют использовать dupChan, который помогает в противоположном случае вещания нескольким читателям.

Чан настолько прост, что не считает количество предметов внутри и не имеет верхней границы. Так что, если производители опередят потребителя, Чан станет очень большим. Если это проблема, то вы можете связать Чан с (MVar Int). и пусть производители и потребители изменят промежуточный итог товаров в Чане.

...