Чтобы реализовать спецификацию snowflake без блокировок. Никакие функции времени не гарантируют уникальности, в случае многопоточности, и для этого есть unique_integer.
а persistent_term зачем? Тебе же нужно время и какой-то ещё инкремент в рамках текущего времени.
Ну инкремент считается через atomic, ссылку на который нужно где-то хранить. Вот в persistent_term эта ссылка один раз кладётся и потом используется.
А разве согласно спецификации atomic не должен ресетиться каждый атом времени?
а где такое написано?
я не уверен что это в спеке, но в твиттерской реализации они ресетят каждую милисекунду
что-то очень странное ты написал
Ну вот в либе и реализуется это ресет. Только это в спеке snowflake а не атомиков.
я почему-то подумал что раз ты хранишь в persistant_term - то не ресетишь.
в pt хранится только ссылка
а зачем? Что пойдет не так, если делать не по такому описанию?
Для меня всегда это было загадкой. Помоему крутить до overflow экономит пару тактов
Да, можно и не ресетить. Но по спеке ресет есть.
Мне кажется, что сильно больше. Ведь надо запомнить предыдущее значение времени и с ним сравнивать. Зачем это делать - не очень ясно. Откуда такое могло взяться - элементарно ясно. В libevent гораздо удобнее в начале цикла вычислить время и потом всем инкрементить.
да вот я и хочу понять: хоть какая-то проблема от нересета есть?
Я не смог придумать.🤷
Обсуждают сегодня