2012-03-08 9 views
9

スレッド間に1つの共有Control.Concurrent.Chanを持つ同時システムを構築する必要があります。唯一の消費者と多くの生産者が存在するでしょう。 Chan documentation私は同じチャネルで動作する可能性のある消費者とプロデューサの数について警告が表示されず、ソースコードはMVarのデフォルトの「安全な」アクセサを使用しているようです。制限があってはならないと思っても安全ですが、わかりません。 私の質問は...複数の読者やプロデューサーにとって、(一般的に)haskellチャンネルが安全かどうか知っていますか?haskellチャンネルは `Control.Concurrent.Chan`は複数の読者/プロデューサにとって安全ですか?

答えて

11

スレッド数に関係なく安全です。それらは単純なMVarベースのリンクリストです。設計上のトレードオフは、複数の読者に放送する反対のケースを助けるdupChanを可能にする。

Chanはとてもシンプルなので、内部のアイテムの数はカウントされず、上限もありません。だから生産者が消費者を追い越せば、チャンは非常に大きくなります。これが問題であれば、Chanと(MVar Int)を組み合わせることができます。生産者と消費者にChanのアイテムの稼働総数を変更させる。

+0

よろしくお願いいたします。すべてのスレッドは完了時に1つのメッセージしか送信しないので、上限が存在しないことは私の場合は問題ではありません。これはシンプルな構造ですが、先に進む前に、メインスレッドがN個のメッセージ(Nがスレッドの数である場合)をチャネルから待つようにします。 –

+0

このようなカウントされたバリアは数量セマフォのように見えますが、最初の量(1-N)を使用して、Chanのリンクリスト長をhttp://hackage.haskell.org/package/SafeSemaphoreのMSemまたはMSemNに置き換えることができます。 –

+0

私はhaskellプラットフォームのセマフォについては知らなかった、それを指摘してくれてありがとう。私は確かに彼らとチャンネルを置き換えます。 –

関連する問題