Сами по себе getStdGen
и setStdGen
в определенном смысле не являются потокобезопасными.Предположим, что оба потока выполняют это действие:
do ...
g <- getStdGen
(v, g') <- someRandOperation g
setStdGen g'
Оба потока могут запустить строку g <- getStdGen
до того, как другой поток достигнет setStdGen
, поэтому они оба могут получить один и тот же генератор,(Я не прав?)
Если они оба получат одну и ту же версию генератора и используют ее в одной и той же функции, они получат одинаковый «случайный» результат.Так что вам нужно быть немного более осторожным при работе со случайными числами и многопоточностью.Есть много решений;одно, что приходит на ум, - это иметь отдельный выделенный поток генератора случайных чисел, который генерирует поток случайных чисел, который другие потоки могли бы использовать потокобезопасным способом.Помещение генератора в MVar, как предполагает FUZxxl, является, вероятно, самым простым и простым решением.
Конечно, я бы посоветовал вам проверить ваш код и убедиться, что необходимо для генерациислучайные числа в более чем одном потоке.