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