Я довольно неопытен с потоками и параллелизмом; Чтобы исправить это, я в настоящее время работаю ради забавы по реализации алгоритма случайного поиска в F #. Я написал обертку вокруг класса System.Random, следуя идеям из существующих примеров на C #, но поскольку я не уверен, как бы я даже начал проводить модульное тестирование этого на предмет некорректного поведения, я хотел бы услышать, что скажут более опытные умы и если в моем коде есть явные недостатки или улучшения, либо из-за синтаксиса F #, либо из-за неправильного понимания потоков:
open System
open System.Threading
type Probability() =
static let seedGenerator = new Random()
let localGenerator =
new ThreadLocal<Random>(
fun _ ->
lock seedGenerator (
fun _ ->
let seed = seedGenerator.Next()
new Random(seed)))
member this.Draw() =
localGenerator.Value.NextDouble()
Мое понимание того, что это делает: ThreadLocal гарантирует, что для экземпляра каждый поток получает свой собственный экземпляр Random со своим собственным случайным начальным числом, обеспечиваемым общим статическим Random. Таким образом, даже если несколько экземпляров класса будут созданы близко во времени, они получат свое собственное начальное число, избегая проблемы «дублирования» случайных последовательностей. Блокировка гарантирует, что никакие два потока не получат одинаковое начальное число.
Это выглядит правильно? Есть ли очевидные проблемы?