создавать глобально переменную и передавать ее в потоки, где она прикидывается локальной?
почему нельзя сразу локальную переменную создать?
я реал не понимаю, если не сложно, объясните
Полезно, когда тебе хочется что-то закешировать не платя при этом за синхронизации между тредами. Пример с хэшмапами: — Тебе нужно использовать случайный сид для хэшера в HashMap, чтобы защититься от DOS-атак — При этом тебе не важно чтобы все хэшмапы получали полностью случайных сид, это бесполезный оверкилл (получать случайное число относительно дорого) — При этом тебе важно чтобы у всех хэшмап был разный сид, чтобы у них не совпадал порядок итерации и не было edge кейсов с квадратичной сложностью Поэтому std — вызывает random() один раз и кэширует в thread_local — при вызове HashMap::new() использует закешированное случайное число как сид и увеличивает закешированное число на 1 В целом в большей части кода это не нужно, но иногда вот вылезает
То есть правильно понимаю: при создании потока делается let mut random_seed = random(); при HashMap::new() происходит random_seed += 1; ?
+-, да Только в начале random_seed сохраняется в структуру, чтобы у одной хэшмапы он всегда был одинаковый и потом делается wrapping_add(1)
Что просто переменная, какое название?
ну я понял, это как глобальная переменная, только уникальная для каждого потока
Глобальная хешмапа thread_id->T
Обсуждают сегодня