На эту тему можно написать целую книгу, поэтому я постараюсь затронуть только те вопросы, о которых вы спрашиваете.
Вы можете использовать комбинатор par
запланировать чистых вычислений, которые будут выполнены в какой-то момент в будущем.Для этого RTS уже реализует очереди для кражи работы, а уже поддерживает один поток на ядро ЦП для их запуска.(Если вы свяжете свою программу с соответствующими переключателями.) Обратите внимание, что это не поможет ни на один бит для нечистого кода и не позволит вам указать, в каком потоке или на каком ядре выполняется код.
Для общего изменяемого хранилища у вас есть два варианта.
Явная блокировка с использованием MVar
.Это имеет все обычные ловушки блокировки в других языках программирования.(Блокировка, забвение блокировки вещей, блокировка слишком многих вещей, блокировка слишком долго, не блокировка достаточно долго ...) Так что MVar (Map k v)
абсолютно считается!
STM.Вы, кажется, неправильно понимаете, что это делает.Весь смысл в STM состоит в том, что вам не нужны блокировки .Он позволяет вам использовать совместно изменяемые структуры данных «как если бы», они не являются общими, но он автоматически предотвращает скачки данных, несогласованное состояние и все другие обычные проблемы, связанные с неиспользованием блокировок.Это также позволяет потоку ожидать нескольких условий одновременно.Это невероятный фреймворк!
Если вы хотите запустить код в определенном потоке ОС, вы, вероятно, ищете forkOS
, а не forkIO
.
Учитывая ваш вариант использования, я подозреваю, что STM, вероятно, то, что вы ищете.Если у вас есть конкретное задание, которое вы пытаетесь выполнить, опубликуйте другой вопрос, и вы, вероятно, получите более конкретный совет.