私は 2 つの MVar (MVar と Chan) を持っています。Chan から何かを取り出して、他の MVar が空でなくなるまで処理する必要があります。私の理想的な解決策は、(おそらく空の) MVar とスレッド ブロックのリストを渡す UNIX 関数のようなものselect
で、そのうちの 1 つがいっぱいになると、完全な MVar が返されます。false になるまで、isEmptyMVar を使用して各 MVar を繰り返しポーリングする以外に、これを行う方法は考えられません。これは効率が悪いようです。
別の考えでは、throwTo を使用することでしたが、それはスレッドで起こっていることを中断し、Chan からアトミックな方法でジョブの処理を完了する必要があります。
私が入力している最後の考えは、MVar を読み取ろうとする各 MVar に対して新しい forkIO を作成し、新しく作成された MVar を独自のインスタンスで埋めようとすることです。その後、元のスレッドはその MVar でブロックできます。Haskell スレッドはそれほど多く実行できるほど安価ですか?