170 похожих чатов

А volatile переменные, они читаются/записываются также как atomic load/store или

чо ваще?

33 ответов

10 просмотров

Нет, почитайте про это

вопрос для супапро. но нет, в общем случае не так

Они больше похожи на релаксед атомики, но атомиками не являются, просто гарантируют запись в память и чтение из неё, в случаях когда результат может казаться компилятору предсказуемым

да, ведь есть даже поговорка "volatile is multithreaded programmer's best friend" от одного из корифеев стандарта - Александреску (на самом деле нет, не слушайте меня)

клюквенный сбитень
да, ведь есть даже поговорка "volatile is multithr...

:https://drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766 >By Andrei Alexandrescu, February 01, 2001 >Just like its better-known counterpart const, volatile is a type modifier. It's intended to be used in conjunction with variables that are accessed and modified in different threads. забавно, что в C++98 есть следующее примечание: [Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. See 1.9 for detailed semantics. In general, the semantics of volatile are intended to be the same in C++ as they are in C. ] при том, что в 1.9 Program execution volatile описывается как побочный эффект, что соответствует современным представлениям

Vlad
:https://drdobbs.com/cpp/volatile-the-multithreade...

проблема в том что в те времена это было implementation-defined

Vlad
:https://drdobbs.com/cpp/volatile-the-multithreade...

Кек в том, что обычно при упоминании atomic/volatile/Александреску в одном предложении и этой его статьи, люди напрочь игнорируют собсно текст этой статьи, а холиварят про "atomic ==/!= volatile зуб даю". А идея-то у него там очень интересная: он использует volatile исключительно как дополнительный квалификатор типа аналогично const (новый придумать не можем же, поэтому тупо используем существующий, но полностью меняем его смысл), и на этой основе он риальне реализует аналог borrow из Rust — если мы хотим использовать объект в разделяемой среде, мы обязаны его "подкрасить" с помощью volatile (фактически заборровить), и работать с подкрашенной ссылкой в критической секции, и возвращать владение в конце скоупа по RAII. А попытки некорректных доступов вне критических секций прямо выдают ошибки компиляции, о как.

Vlad
:https://drdobbs.com/cpp/volatile-the-multithreade...

спасибо за такой детальный обзор!

A T
Кек в том, что обычно при упоминании atomic/volati...

полностью меняем его смысл я читал по диагонали, конечно, но он в нескольких местах прямо говорит, что мол volatile для этого-то и нужен. но признает, что с фундаментальными типами проблемы все равно остаются, из-за чего заставляет оборачивать их в пользовательский тип

Vlad
полностью меняем его смысл я читал по диагонали, к...

ну, согласен, не совсем уж полностью. но если смотреть на текущий стандарт, разница между "запрещено оптимизировать и переставлять" и "использовать как независимый от const квалификатор и реализовать scope-based multithreaded guard" таки есть

a11e99z- Автор вопроса
A T
Кек в том, что обычно при упоминании atomic/volati...

Александреску ушел в D, где есть keyword "shared" именно с этим смыслом.. и года 2 назад отошел

A T
Кек в том, что обычно при упоминании atomic/volati...

Какой смысл так делать, если это не работает? В сообществе сложился консенсус, что volatile и atomic понятия ортогональные.

Гласси
Какой смысл так делать, если это не работает? В со...

Что не работает? Александреску привел конкретный пример, ВСЕ остальные что-то себе придумали, на фантазировали и теперь им кто-то виноват? Пример заключается что один поток читает, другой пишет bool флаг. Никакой гонки данных на модификации НЕТ, ибо потоков всего два. Если не поставить волотайл то при чтении будем вечно читать значение из регистра, при волотайле ВСЁ будет работать так как надо! Если вы про то что, возможна ситуация, что два потока работают идеально только в своих ядрах. и укаждого ядра есть свой L1. и так как нет барьера(и нет синхронизации L1) то волатайл да тут не сработает. Но ИМХО речь шла про Биг ОСь и там рано или поздно сама ОСь сделает синхронизацию. Про эмбедет там не было ни слова, и почему-то люди в 2001 это понимали, а сейчас перестали? ну может потому что стали давать первым языком Питон и Джаву, вместо Си?. Потом статья 2001 года до введения атомиков в язык еще ой как далеко. При этом он следом же рассматривает мьютекс и говорит, что имея модифиактор volatile мы его можем снять через каст, если мы работаем внутри критической секции ибо повысим (возможную) эффективность. при выходе из секции примитив все сам сделает по красоте. А то что подкрашивать методы через volatile ну так сейчас это вроде как запретили вешать этот модификатор для классов, методов и функций ибо не имеет никакого практического смысла. Volatile заставляет каждое чтение и запись делать всегда, тобишь не кэшировать переменную в регистре. Александреску говорит только об этом, ни об атомарности, ни барьерах речи не шло. Это додумали знатоки, которые потом начали кого-то обвинять.

Stas Koynov
Что не работает? Александреску привел конкретный п...

Еще раз: сюда незачем это тащить, это а) не работает, б) из 2001 года. volatile модификатор и для структур тоже, там фокус с bool флагом не проходит. (заканчиваю дискуссию)

Гласси
Еще раз: сюда незачем это тащить, это а) не работа...

Притащили другие, у меня подгорает, когда люди не делают поправку на год статьи. И вместо того, чтобы пояснить человеку что имел ввиду Александреску, нет, мы побудим Дартаньяном. ИМХО в 2001 году у 99% людей были одноядерные процы. и там это злополучный пример работал! А Вы набрасываете на самого Александреску мол он идиот и это НЕ РАБОТАЕТ. Это работает в его примере и с поправками, которые люди понимали в 2001 году. А если вы набрасываете, так уточните, а не так мол волотайл != атомик и ВАШ Александреску идиот он не понимает разницу из-за чего пишет статьи в которых все не правда. Человек сюда пришел с вопросом, ему накидали даже такую древность. Вместо того, чтобы пояснить человеку, нет надо быть душным. PS оффтопик.

емнип в msvc volatile всегда работал как memory barrier, так что пример с bool будет работать а msvc и в наше время ( классически в double checked lock, например )

olkivan
емнип в msvc volatile всегда работал как memory ba...

вот где вы такие нашли. еще с с++11 народ активно на всех конференциях говорит что volatile это о другом - для чтения регистров железяк

Alex
вот где вы такие нашли. еще с с++11 народ активно ...

так вроде предлагают задепрекейтить volatile, вот доклад про это https://www.youtube.com/watch?v=KJW_DLaVXIY

Alex
вот где вы такие нашли. еще с с++11 народ активно ...

https://learn.microsoft.com/en-us/cpp/build/reference/volatile-volatile-keyword-interpretation?view=msvc-170

Богдан
так вроде предлагают задепрекейтить volatile, вот ...

Не надо. Он ставит на место компилятор, который пытается оптимизировать запись/чтение в железяку for (int i = begin; i <= end; ++i) { *(volatile int*)0xFF0008 = i; // if not "volatile", compiler does it only once }

Удалим volatile, введем новый стандартный атрибут! (я не смотрел доклад, я выдумываю)

Богдан
так вроде предлагают задепрекейтить volatile, вот ...

volatile compound assignment уже успели и депрекейтнуть, и де-депрекейтнуть https://github.com/cplusplus/papers/issues/1023

Eoan Ermine
Удалим volatile, введем новый стандартный атрибут!...

Пусть сначала модель памяти приближённую к реальности завезут

Богдан
так вроде предлагают задепрекейтить volatile, вот ...

Запретили как раз делать методы и вешать volatile куда не нужно. про шорт операции уже откатили в 23++.

Vlad
к реальности на какой платформе?

На всех сразу, то что есть сейчас слишком далеко от реальности

Vlad
volatile compound assignment уже успели и депрекей...

а, было даже веселее 1) в 20 стандарте депрекейтнули все volatile compound assignments 2) потом в 23 стандарте в последний момент де-депрекейтнули побитовые volatile compound assignments 3) этот де-депрекейт попытались отменить через national body comment в процессе утверждения 23 стандарта (подозреваю, что авторы первоначального депрекейта). основной аргумент — непоследовательность 4) EWG вместо того, чтобы согласиться, разделилась примерно поровну, а это значит отсутствие консенсуса 5) и проголосовала за то, чтобы де-депрекейтнуть все остальные volatile compound assignment занавес https://github.com/cplusplus/nbballot/issues/488

Vlad
@KoynovStas

да я даже пивка хлопнул, когда в 23++ откатили это.

Похожие вопросы

Обсуждают сегодня

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
а не подскажете вот это скрин из какой IDE ?
Iluha Companets
14
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Продолжая диалог про свифт в проде – сейчас возник вопрос в активном наборе бекендеров. В основном в нашей компании мы фанаты Java Spring и полностью ей довольны. Однако найм ...
Guseyn
27
Народ всем привет Подскажите, как включить самописные dll библиотеки в итоговую сборку Сейчас при запуске dev сервера локально формируется папка build, из которой запускается...
Андрей
4
Комрады, подскажите, в дельфях есть компоненты а-ля TDirectorySelect?
Ed Doc
15
Карта сайта