У меня есть два MVars (ну MVar и Chan). Мне нужно вытащить вещи из Чан и обработать их до тех пор, пока другой MVar больше не будет пустым. Мое идеальное решение было бы чем-то вроде функции UNIX select
, в которой я передаю список (предположительно пустых) MVars и блоков потоков до тех пор, пока один из них не будет заполнен, а затем вернет полный MVar. Попытайтесь, чтобы я мог думать о том, чтобы не делать этого заново, неоднократно опросив каждого MVar с помощью isEmptyMVar, пока не получу false. Это кажется неэффективным.
Другая мысль заключалась в том, чтобы использовать throwTo, но он прерывает то, что когда-либо происходит в потоке, и мне нужно закончить обработку работы из Chan атомным способом.
Последнее, что я набираю, - это создать новый forkIO для каждого MVar, который пытается прочитать его MVar, а затем заполнить вновь созданный MVar своим собственным экземпляром. Исходный поток затем может блокировать этот MVar. Являются ли потоки Haskell дешевыми, чтобы их можно было запустить?