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

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

чо ваще?

33 ответов

17 просмотров

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

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

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

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

Rustam
да, ведь есть даже поговорка "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...

и вам за исторический бекграунд

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++ откатили это.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта