Можно пожалуйста вопрос про double deletion, немного не понимаю как он возникает, если два потока сперва инициализируют Old, и второй успевает сместить head и сделать delete, то первый же поток видит в CASе что head изменился и обновляет значение Old, и затем удаляет уже его?
Привет! У меня вопрос по поводу реализации метода push. В нем у нового узла переменная Next иницилизируется в конструкторе узла и потом не меняется. Т.е. если между созданием нового узла и попыткой его добавления (через compare_exchange_weak) кто-то окажется быстрее и обновит Head до нас, то дальше мы будем бесконечно вращаться в цикле while. Не нужно ли в случае неудачной попытки compare_exchange_weak делать New.Next = Head.load?
Сейчас когда вы пишете CAS вы говорите только о сравнении значений, транзакционность никто не обещает. С новыми примитивами вы получите гарантии на уровне абстрактной машины.
@@tilir что-то не поняли друг друга. Может ошибаюсь, в AXI ACE спецификации для slave устройств было расширение типа дополнительного массива регистров адресов транзакций. При начале транзакции мастера слейв запоминал адрес транзакции, и слейв мониторит все записи по адресам транзакций если id мастера отличаются от инициатора то запоминает у себя флаг сломанной транзакции, мастер при завершении операций запрашивает подтверждение транзакции у слейва и слейв выдает ему бит сломанной транзакции. Таким образом отлавливая даже запись того-же самого значения в адрес транзакции /атомик/. И все сигналы инициации и проверки транзакции совпадали с обычными сигналами мастера CAS инструкции. Если мой склероз не подводит, таким образом все новые ARM процессоры с контроллером памяти поддерживающее расширение получают защиту от ABA автоматически на аппаратном уровне, изменение С++ не требуется. Лицензия AXI ACE позволяет ее свободное использование для процессоров других архитектур, таким образом и RISCV может получить решение задарма. Разве не так?
Modern Mr. Proper, как всегда хорош
Классная лекция! 👍
Константин, спасибо за доклад.
Вот тут не испуганная девушка 14:07
А вот тут испуганная 17:20
Доклад удался :D
Легенда
Интересная лекция
Я надеялся что доклад выложит аскон. Но ... )))
Дайте плиз ссылку на выступление Антона Полухина про бешенный cow. Никак найти не могу
th-cam.com/video/rJWSSWYL83U/w-d-xo.html
@tilir спасибо большое
Здравствуйте, спасибо за доклад, а можно слайды?
Добавил в описание под видео. Слайды тут: sourceforge.net/projects/cpp-lects-rus/files/conference-talks/
Можно пожалуйста вопрос про double deletion, немного не понимаю как он возникает, если два потока сперва инициализируют Old, и второй успевает сместить head и сделать delete, то первый же поток видит в CASе что head изменился и обновляет значение Old, и затем удаляет уже его?
Два потока делают head.load(), затем кто-то из них точно сделает delete, а другой может свалиться на разыменовании невалидного указателя в cas
Привет! У меня вопрос по поводу реализации метода push. В нем у нового узла переменная Next иницилизируется в конструкторе узла и потом не меняется. Т.е. если между созданием нового узла и попыткой его добавления (через compare_exchange_weak) кто-то окажется быстрее и обновит Head до нас, то дальше мы будем бесконечно вращаться в цикле while. Не нужно ли в случае неудачной попытки compare_exchange_weak делать New.Next = Head.load?
Нет неправильно. Эту загрузку уже делает CAS.
@@tilir Понял, спасибо!
С аппаратной поддержкой на шине, самые обычные CAS Команды начинают отлавливать запись в атомик, вероятно изменение С++ не нужно
Сейчас когда вы пишете CAS вы говорите только о сравнении значений, транзакционность никто не обещает. С новыми примитивами вы получите гарантии на уровне абстрактной машины.
@@tilir что-то не поняли друг друга. Может ошибаюсь, в AXI ACE спецификации для slave устройств было расширение типа дополнительного массива регистров адресов транзакций. При начале транзакции мастера слейв запоминал адрес транзакции, и слейв мониторит все записи по адресам транзакций если id мастера отличаются от инициатора то запоминает у себя флаг сломанной транзакции, мастер при завершении операций запрашивает подтверждение транзакции у слейва и слейв выдает ему бит сломанной транзакции. Таким образом отлавливая даже запись того-же самого значения в адрес транзакции /атомик/. И все сигналы инициации и проверки транзакции совпадали с обычными сигналами мастера CAS инструкции. Если мой склероз не подводит, таким образом все новые ARM процессоры с контроллером памяти поддерживающее расширение получают защиту от ABA автоматически на аппаратном уровне, изменение С++ не требуется. Лицензия AXI ACE позволяет ее свободное использование для процессоров других архитектур, таким образом и RISCV может получить решение задарма. Разве не так?
Вы когда пишете программу на C++ пишете её не для конкретной архитектуры а для абстрактной машины. Поэтому просто забудьте всё что вы выше написали.
А о каких футболках идет речь?
На конференции выдавали Асконовские футболки с каким то кодом на них ibb.co/RSXSyMx