Да. В программе допущена ошибка в 47 строке. Должно быть: 47 atomic.CompareAndSwapPointer(&q.tail, tail, next) Также предлагаю рефакторинг: В методе Push три раза (строки 40, 42, 47) встречается unsafe.Pointer(node) Лучше в строке 29 сразу один раз написать: node := unsafe.Pointer(&item{value: value}) Тогда в других строках вместо unsafe.Pointer(node) можно будет использовать просто node. Для ясности кода я бы переменную node переименовал в newNode.
7:32 На строке 47 в Push, случайно не должно быть next вместо unsafe.Pointer(node)? Мы же пытаемся исправить хвост, а не пушнуть туда свой элемент. Или я неправильно понял?
Push можно сократить до одного ifика, так и читается легче. func (queue *Queue[T]) Push(value T) { element := &element[T]{value: value} for { tail := queue.tail.Load() if tail.next.CompareAndSwap(nil, element) { queue.tail.CompareAndSwap(tail, element) return } else { queue.tail.CompareAndSwap(tail, tail.next.Load()) } } }
У меня два подозрения: 1) В новую очередь добавить элементов. Первый Pop() вернет 0, потому что очередь инициализируется с нулевым элементом, который не удаляется. 2) Во время жизни очереди в ней иногда будет оставаться один элемент. Тогда head == tail и вернет -1, хотя лежит нормальное значение.
Классный материал, Владимир, а можете порекомендовать какую-нибудь хорошую книгу по lock-free структурам данных? А то что то гуглятся одни статьи на Хабре.
Получается, придумали простой язык, чтобы на нем все заново изобретали велосипед? Очень напоминает ситуацию с ЯП C, на структурах которого изобретали ООП в стиле C++, реализовывали наследование, виртуальные методы и тд. Может, каждый язык для своих нужд? Молотком тоже можно кашу есть, но неудобно
Вообще очень бесит эта заразно распространяющаяся (особенно среди HR) манера "ты" - каний. Мы в один детский сад не ходили, водку вместе не пили и не переспали вместе, чтобы непонятно кто мне "ты" - кал. Фактически, этим самым они нарушают личные границы собеседников и проявляют неуважение. И естественно проявляется это исключительно у молодого поколения ..
@@klimovevgeny, это it, тут все на «ты». Тем более Владимир в Яндексе трудится (я тоже), у нас культура такая, что все на ты. Забавно, что для любого руководителя обращение на «ты» не нарушает его границ.
@@Smurfetti Я в IT уже 30 лет, и на "ты" только с теми, с кем вместе работаю. Для всех остальных на "вы". И я, и ко мне. Это вопрос культуры. Она существует вне рамок сферы деятельности. Или её у вас просто нет. И не надо превращать IT в помойку. Это всё западное мерзотное бескультурное веяние флегматичных компьютерных задротов
@@klimovevgeny, можно быть модными молодёжными с заранее позитивным отношением ко всем, а можно душно работать по waterfall и ко всем на «вы». Выбор за тобой
@@Smurfetti Ага, модно-молодёжно, по горло в скраме, в стиле "не знаю когда, не знаю что, не знаю как, но может быть". Ниче, скоро это закончится, конкуренция всё сожрёт, безответственность ни одному работодателю не уперлась. Всех вылечат) Молодость - это тот недостаток, который проходит с годами. А если не проходит, то уже выглядит инфантильно и смешно
Присоединяйтесь к моему каналу в Телеграм: t.me/vladimir_balun_programming
Радует, что видео выходят регулярно,спасибо!
Не за что!
Да. В программе допущена ошибка в 47 строке.
Должно быть:
47 atomic.CompareAndSwapPointer(&q.tail, tail, next)
Также предлагаю рефакторинг:
В методе Push три раза (строки 40, 42, 47) встречается unsafe.Pointer(node)
Лучше в строке 29 сразу один раз написать: node := unsafe.Pointer(&item{value: value})
Тогда в других строках вместо unsafe.Pointer(node) можно будет использовать просто node.
Для ясности кода я бы переменную node переименовал в newNode.
да, первое и с unsafe.Pointer(node) тоже заметил
7:32 На строке 47 в Push, случайно не должно быть next вместо unsafe.Pointer(node)?
Мы же пытаемся исправить хвост, а не пушнуть туда свой элемент. Или я неправильно понял?
Push можно сократить до одного ifика, так и читается легче.
func (queue *Queue[T]) Push(value T) {
element := &element[T]{value: value}
for {
tail := queue.tail.Load()
if tail.next.CompareAndSwap(nil, element) {
queue.tail.CompareAndSwap(tail, element)
return
} else {
queue.tail.CompareAndSwap(tail, tail.next.Load())
}
}
}
У меня два подозрения:
1) В новую очередь добавить элементов. Первый Pop() вернет 0, потому что очередь инициализируется с нулевым элементом, который не удаляется.
2) Во время жизни очереди в ней иногда будет оставаться один элемент. Тогда head == tail и вернет -1, хотя лежит нормальное значение.
Классный материал, Владимир, а можете порекомендовать какую-нибудь хорошую книгу по lock-free структурам данных? А то что то гуглятся одни статьи на Хабре.
Привет! А на 47 строке не должно быть CAS(&q.tail, tail, next)? Кажется что unsafe.Pointer(node) уже может быть другой нодой, или просто я туплю 😅
В статье Скотта упоминается double CAS, которого в Go нет, для избежания проблемы ABA. Как вы обошли эту проблему? :)
Я в предыдушем видео рассказывал про АBA проблему в контексте Go
@@vladimir_balun_programmingспасибо 🙏
Получается, придумали простой язык, чтобы на нем все заново изобретали велосипед? Очень напоминает ситуацию с ЯП C, на структурах которого изобретали ООП в стиле C++, реализовывали наследование, виртуальные методы и тд. Может, каждый язык для своих нужд? Молотком тоже можно кашу есть, но неудобно
Оооооооооооочень мелко на телефоне смотреть не возможно🤷🏻♂️ но за контент спасибо!
Пока го не узучаю просто коммент в поддержку
Грубовато "тыкает" автор.
Вообще очень бесит эта заразно распространяющаяся (особенно среди HR) манера "ты" - каний. Мы в один детский сад не ходили, водку вместе не пили и не переспали вместе, чтобы непонятно кто мне "ты" - кал. Фактически, этим самым они нарушают личные границы собеседников и проявляют неуважение. И естественно проявляется это исключительно у молодого поколения
..
@@klimovevgeny, это it, тут все на «ты». Тем более Владимир в Яндексе трудится (я тоже), у нас культура такая, что все на ты. Забавно, что для любого руководителя обращение на «ты» не нарушает его границ.
@@Smurfetti Я в IT уже 30 лет, и на "ты" только с теми, с кем вместе работаю. Для всех остальных на "вы". И я, и ко мне. Это вопрос культуры. Она существует вне рамок сферы деятельности. Или её у вас просто нет. И не надо превращать IT в помойку. Это всё западное мерзотное бескультурное веяние флегматичных компьютерных задротов
@@klimovevgeny, можно быть модными молодёжными с заранее позитивным отношением ко всем, а можно душно работать по waterfall и ко всем на «вы». Выбор за тобой
@@Smurfetti Ага, модно-молодёжно, по горло в скраме, в стиле "не знаю когда, не знаю что, не знаю как, но может быть". Ниче, скоро это закончится, конкуренция всё сожрёт, безответственность ни одному работодателю не уперлась. Всех вылечат) Молодость - это тот недостаток, который проходит с годами. А если не проходит, то уже выглядит инфантильно и смешно