|
1 / 1 / 0
Регистрация: 03.08.2017
Сообщений: 205
|
|||||||||||
Имеет ли смысл создавать volatile переменную16.09.2026, 11:08. Показов 13886. Ответов 171
У меня есть функция
0
|
|||||||||||
| 16.09.2026, 11:08 | |
|
Ответы с готовыми решениями:
171
1 класс имеет переменную указатель на 2, 2 имеет на 1 Применение описателя Volatile Пример использования спецификатора volatile |
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
|
|||||
| 23.09.2026, 16:37 | |||||
|
Вот это аргументированный ответ. И никаких тайн ведь нет - любой может просмотреть систему команд. Почему никто не пытается? Тогда ведь станет ясно, что на подавляющем большинстве платформ можно найти такие типы данных, операции чтения и записи для которых будут всегда атомарны. Операции присваивания с типом char насколько мне известно - на всех платформах атомарны. По-крайней мере я не помню ни одной, где они бы не были атомарны. Мой пример можно запросто на char volatile переделать. Заменив всего одно слово в одном месте. И тут у некоторых теоретиков порвало пуканы. Они начали писать, что volatile вообще не нужен...
1
|
|||||
|
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 35
|
|||
| 23.09.2026, 17:06 | |||
|
0
|
|||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|
| 23.09.2026, 18:08 | |
|
Тут осталось лишь в 100500 раз вспомнить первые приходящие на ум попоболи всех этих "знатоков платформ" (где за их воображаемым "знанием платформы", разумеется, скрывается лишь лень изучать язык программирования) из обширной хронологии этих попоболей, которые мы имели возможность наблюдать, понимающе улыбаясь, за недавние десятилетия.
Что у нас там первое? Strict overflow semantics? "Знаковые типы всегда заворачиваются, как беззнаковые! Надо знать платформу! Приведи пример платформы!!1...", затем броуновское метание со столбами дыма из задниц, потешные столкновения лбами, вопли "Эти идиоты ничего не понимают! Я не буду пользоваться этим компилятором!! На мыло всех разработчиков!!!...", вмешательство санитаров, этап принятия. "Можно возвращать указатели на локальные переменные! При выходе из функции данные просто остаются в стенке нетронутыми! Надо знать платформу! Приведи пример платформы!!1..." Компиляторы начинают наказывать рукопопых пионэров через ud2 или возврат нуля. Броуновское метание со столбами дыма из задниц, потешные столкновения лбами, вопли "Эти идиоты ничего не понимают! Я не будут пользоваться этим компилятором!! На мыло всех разработчиков!!!...", вмешательство санитаров, этап принятия. Затем UB при попытках применять memcpy к перекрывающимся регионам, strict aliasing semantics, неинициализированные переменные, бесконечные циклы и т.д. и т.п... Далее, ну вы догадались: броуновское... лбами... этап принятия. И таких итераций - не счесть.Но так как эта публика необучаема, ни один из этих этапов принятия, как вы сами понимаете, не является последним. Никаким объяснениями тут делу не поможешь. ¯\_(ツ)_/¯
6
|
|
|
391 / 336 / 66
Регистрация: 14.10.2014
Сообщений: 1,537
|
|
| 23.09.2026, 19:21 | |
|
Полностью согласен с TheCalligrapher, если речь идёт о С++ и вопросы исключительно про С++, то не надо приплетать сюда внутреннее устройство той или иной платформы. Есть стандарт языка, он даёт определённые гарантии и если следовать этому стандарту - то будет ожидаемое и понятное всем, кто хоть немного знаком с С++, поведение. ПРИЧЁМ НА ВСЕХ ПЛАТФОРМАХ!!!!! Всё остальное - «От лукавого»
А ежели спросили - а как этот кусок кода можно оптимизировать или сделать так, чтоб он лучше работал. То милости просим - начинаем срач на тему "как оно там внутри устроено"
0
|
|
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
|
||
| 24.09.2026, 09:42 | ||
|
Не по теме: Как правило - такие теоретики, типа персонажа выше, только на форумах умеют громогласно разглагольствовать. Когда дело доходит до реальной программы, вдруг оказывается что "Гениальный код почему-то глючит. Видимо компилятор виноват - плохо компилит." :D
0
|
||
|
391 / 336 / 66
Регистрация: 14.10.2014
Сообщений: 1,537
|
|||
| 24.09.2026, 15:45 | |||
|
Меня интересует - какую задачу мне поставили (какую программу нужно разработать и что она должна делать ) - под какую архитектуру - тут меня интересует наличие компилятора и нужных библиотек. Внутренним устройством вот вообще не заморачиваюсь, если только условия задачи этого требуют. - какой стандарт языка можно использовать (бывают ограничения из-за платформы - допустим, она не поддерживает новейший стандарт, то есть для данной платформы тупо нет компилятора под современный стандарт языка. То, что это из-за того, что процессор на данной платформе не может выполнять какие-то команды - мне пофиг.... У меня задача совершенно другая и разрабатывать я буду на более высоком уровне - где мне не надо заморачиваться всеми этими командами. Скорее всего вы писали код всегда под конкретные платформы, всегда низкоуровневый - до жути оптимизированный. Я не говорю - что это хорошо или плохо. Это просто решение конкретных задач, которые перед вами стояли. Мне же, чаще всего, приходилось писать кроссплатформенный код и очень часто при помощи C++ Qt. И уж поверьте - знатоки архитектур, предлагающие на подобных проектах свои "мега оптимизации - мол вот это точно будет работать потому что .... (тут каждый знаток "железа" может вставить своё )" сразу шли далеко и на долго в известном направлении . Наоборот, от нас очень часто требовали писать максимально простой, понятный, без всяких низкоуровневых приколов, код. Если цель - выжать все соки из конкретной платформы, из конкретной архитектуры и нигде более данный код запускаться не будет - тут можно изгаляться над железом, как душе угодно. Потому что задача стоит соответствующая. Я понял, что вы знаток архитектур и ассемблера. Хвала вам и почёт за это, без всякого сарказма. Сам я, ассемблер и прочие низкоуровневые вещи, если что - не знаю - как то не приходилось с ними сталкиваться. Но изучить, если время будет, хотя бы поверхностно - охота. За ваш пример - спасибо, обмозговал, подумал - узнал для себя некоторые новые вещи НО НЕ НАДО ВСЕХ ГРЕСТИ ПОД ОДНУ ГРЕБЁНКУ!!!! И НЕ НАДО, УСЛОВНО, ВПАРИВАТЬ ВСЕМ СВОИ НИЗКОУРОВНЕВЫЕ АРХИТЕКТУРНЫЕ РЕШЕНИЯ.Ваш пример интересен, но интерес его исключительно теоретический - заставляет подумать, поразмыслить. В абсолютном большинстве реальных проектов такое использовать НЕЛЬЗЯ, за такое будут БИТЬ ПО РУКАМ И ГНАТЬ ССАНЫМИ ТРЯПКАМИ, что аж пятки сверкать будут. Предположу, что есть крайне небольшое число реальных проектов, где подобное творчество будет использоваться. Но - там это либо действительно нужно будет (код очень сильно заточен под конкретное железо), либо кто-то, подобный вам, будет писать в одиночку. Вообще - если разработчик что-то сочиняет в одиночку, особенно упёртый на чём либо - уууух мать. Там такого можно будет увидеть.... ![]() ![]() И да - я не пытаюсь вас переубедить - я просто, развёрнуто ответил на ваш вопрос.
0
|
|||
| 24.09.2026, 17:56 | |||||||
|
Еще вопросик. Потоку всегда надо как-то "выйти", поэтому часто пишется типа
И я сам поступлю так же. Но все-таки интересно, а почему? Ну вот stopFlag НЕ атомик, что мне за это будет? Практически это обычно сходит с рук, ну не увидел рабочий поток отмены, сделал еще итерацию, не беда, отмена сработает(?) чуть позже.Хотелось бы услышать грамотное, пусть "академическое" объяснение. Спасибо
0
|
|||||||
|
391 / 336 / 66
Регистрация: 14.10.2014
Сообщений: 1,537
|
||
| 24.09.2026, 18:20 | ||
![]() Мой ответ - может сложиться такая ситуация что один поток заканчивает читать stopFlag, в этот момент другой поток начинает изменять (писать в ) stopFlag. В результате можем получить ситуацию, что два разных потока прочитают одно и тоже значение. Либо один поток поломает значение для другого. Если такая ситуация приемлема - то и нечего переживать, ну а чё оно.... ![]() Добавлено через 3 минуты а атомик гарантирует предсказуемое поведение - без всяких доп приколов в виде - а чё падает... надцать лет работало и ничего, а тут вдруг.....
0
|
||
|
фрилансер
6506 / 5756 / 1134
Регистрация: 11.10.2019
Сообщений: 15,404
|
|
| 24.09.2026, 21:51 | |
|
0
|
|
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||||||||||
| 25.09.2026, 03:25 | |||||||||||
|
Конкуретный доступ к неатомарной переменной - неопределенное поведение (UB).
Как уже 100500 раз втолковывалось, UB существует в языке в большой мере для выполнения оптимизаций. И главный принцип, который позволяет использовать UB для этих целей, звучит (в который раз) так: компилятор имеет право полагать, что стечение обстоятельств, приводящее к UB, никогда не возникает. То есть ожидается, что компилятор в процессе статического анализа кода будет выявлять UB и далее оптимизировать код в предположении, что "этого не может быть никогда". Если UB некоторого участка кода является условным, то компилятор имеет право полагать, что соответствующее условие всегда заведомо ложно. Если UB некоторого участка кода является безусловным, то компилятор имеет право полагать, что управление никогда не попадет в этот участок кода и его можно полностью выкинуть. И т.д. и т.п. Мы здесь уже тысячи раз видели примеры того, как компиляторы это делают. И слушали сопутствующие попобольные вопли пионэров, имеющих странную манеру "транслировать" С/С++ код в машинные команды на основе собственных фантазийных домыслов, и почему-то ожидающих этого от компилятора. Что касается кода, UB которого имеет место из-за того, что в нем выполняется конкурентный доступ к неатомарному объекту... понятно, что обнаружить такое UB через статический анализ кода трудно или даже невозможно. Так что не приходится ожидать, что компиляторы будут "наказывать" вас за такой овнокодинг в ближайшем будущем. (Хотя, с другой стороны, трудно предсказать, каких высот достигнут компиляторы в статическом анализе в средне-ближайшем будущем, учитывая возможности ИИ). Однако существенно более реалистичной причиной, по которой компиляторы сейчас не будут гоняться за оптимизациями через такой UB, является то, что она статистически незначительна: в реальной жизни никто просто так не делает. Даже среди пионэров-кулхацкеров нет такой манеры. Надо быть уж полным емелюшкой, чтобы использовать неатомарную переменную (volatile или нет - не важно) там, где можно просто написать std::atomic<> и получить во всех отношениях абсолютно тот же самый результат, но без UB.Добавлено через 2 часа 1 минуту --- Кстати, интересно также посмотреть как в С коде, генерируемом GCC и Clang, обрабатываются простые присваивания констант для _Atomic и volatile
xchg (даже не mov). А volatile - через обычный mov с непосредственным операндом. Формально последняя - в целом не атомарная операция, но сам акт записи в память в ней по идее должен быть атомарным.Мне навскидку не понятно, почему компиляторы настаивают именно на xchg.
1
|
|||||||||||
|
3141 / 1742 / 274
Регистрация: 19.02.2010
Сообщений: 4,550
|
||
| 25.09.2026, 10:47 | ||
|
If a memory operand is referenced, the processor’s locking protocol is automatically implemented for the duration of the exchange operation, regardless of the presence or absence of the LOCK prefix
0
|
||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
|
||||||
| 25.09.2026, 12:18 | ||||||
|
Добавлено через 1 минуту Вы в своих atomic-ах уже запутались. Не нужен тут никакой atomic. Нужен volatile. Добавлено через 10 минут Лучше поздно, чем никогда. ![]() Это то, о чём я тут твердил с начала темы. И с чем вы (с кодлой приспешников) спорили с пеной у рта. Добавлено через 6 минут
0
|
||||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||
| 25.09.2026, 17:53 | |||
|
Я ошибочно полагал ("знал, но забыл"), что выровненный mov тоже содержит неявный lock. А это далеко не так. Инструкция mov гарантирует "монолитность" операции сохранения данных, однако не гарантирует требуемой когерентности памяти. Инструкция mov не генерирует полноценный барьер в памяти (как это делал бы префикс lock). Сохранение данных в память через mov имеет более слабую семантику: memory_order_seq_cst, то есть лишь release-semantics в случае записи в память. Чтобы получить полноценный барьер с mov, нужно еще прилепить за ней mfence. Но это будет уже менее эффективно, чем xchg.С mov без mfence мы получаем memory_order_seq_cst, а это значит, что возможно вот такое развитие событий:0. Две переменных x и y изначально равны 01. Два потока X и Y запускаются. Поток X делает только x = 1. Поток Y делает только y = 1.2. Посторонние наблюдатели - потоки A, B, C ... - сначала видели в переменных x и y нули, затем они увидят как какая-то переменная первой получит значение 1, затем они увидят как обе получили значение 1.3. Если потоки X и Y выполняют присваивание с memory_order_seq_cst (mov в volatile), то разные наблюдатели могут видеть разное развитие событий, т.е. какая переменная получила значение 1 первой: в переходный период некоторые потоки-наблюдатели могут видеть ситуацию x==1, y==0, а другие - ситуацию x==0, y==1.Если работа с переменными идет с полноценным барьером (префикс lock, явный или неявный, т.е. xchg), то все наблюдатели будут видеть строго одно и то же, т.е. будут согласны в том, какая переменная получила значение 1 первой. Вот именно поэтому для атомарных переменных генерируется xchg. Никакой mov сам по себе тут работать не будет.То есть, еще раз, инструкция mov гарантирует "монолитность" записи, но не дает требуемой для синхронизации когерентности памяти. То есть mov - это никогда не атомарная инструкция. Разумеется, никакой "синхронизации" вы через mov не получите. Так что, еще раз, унылый бред сивой кобылы от "знатоков платформ" о том, как они будут использовать volatile переменные для синхронизации, ценен только тем, что позволяет нам обратить внимание на вот такие вот детали. Но, как уже говорилось не раз, необучаемым все это можно дылдонить до бесконечности - все бесполезно.
0
|
|||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||
| 25.09.2026, 20:23 | ||
|
Что же касается volataile, то как уже много где разбиралось, если компилятор запрещает переупорядочивание вокруг нее и архитектура гарантирует aqcuire-release семантику (как x86), то она действительно может использоваться для синхронизации. Но там товарищ ранее упомянул ARM, не уточнив, что на ARM с weakly-ordered моделью памяти volatile обеспечивает только memory_oreder_relaxed семантику и уже не может использоваться для синхронизации (в привычном понимании этого слова). Правда непонятно, зачем заниматься хреновней, если есть std::atomic и std::memory_order на любой вкус.
1
|
||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||
| 25.09.2026, 21:34 | |||
memory_order_seq_cst - это наоборот, самая сильная гарантия, которую мы получаем от lock-операций, включая xchg. mov нам дает только memory_order_release.mov прямо из коробки. Интеловский мануал содержит примеры того, как может вести себя именно mov. В частности пример, который разбирает Preshing вот здесьhttps://preshing.com/20120515/... n-the-act/ (В современной версии интеловского мануала это глава 11, а не 8, как по ссылке)
0
|
|||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
|
|||||
| 26.09.2026, 13:20 | |||||
![]() Это почище того бреда, что вы несли про fabs() в другой теме. Так бывает, когда тему, о которой пытаешься рассуждать, знаешь только теоретически. Из роликов в инете и подсказок ИИ. ![]() Добавлено через 2 минуты ![]() Думаете - сперва один процесс/задача пишет один бит, потом следующая задача - следующий бит т.д.? Или как?Вот допустим - есть команда: STRB Rx,[Ry] и похожая команда STRB, выполняющаяся в другом потоке (или даже другим ядром). И есть байтовая переменная, используемая для синхронизации. Расскажите в каком именно случае при записи возникнет проблема? Добавлено через 8 минут
0
|
|||||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||
| 26.09.2026, 14:25 | ||
|
0
|
||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||||||||||||
| 26.09.2026, 17:51 | ||||||||||||
|
1. В аппаратных мануалах атомарные операции - это всего лишь монолитные/неделимые операции. Такие операции гарантируют, что никакой внешний наблюдатель не увидит "рваных" данных, то есть не увидит операцию сделанной наполовину. Все. 2. С и С++ на встроенные операции над атомарными объектами накладываются дополнительные требования - это вышеупомянутая монолитность плюс требование того, чтобы при работе с такими атомарными объектами через встроенные операторы использовался memory_order_seq_cst (6.2.6.1/9, 6.5.16.2/3, 6.5.2.4/2 и т.п.). В С и С++ такие операции гарантируют не только то, что внешний наблюдатель не увидит операцию сделанной наполовину, но то что все внешние наблюдатели видят один и тот же глобальный порядок изменения данных.xchg сответствует С/С++ требованиям атомарности, mov - не соответствует.Наше "знающее платформы" дарование не может врубиться в тот замечательный факт, что для реализации синхронизации на коленке через "тупо читаем и записываем переменные" совершенно недостаточно первой атомарности. Нужна именно вторая. Но это, конечно же, глубокая теория. Для теоретиков ![]() --- Кстати, раньше не удосуживался разглядывать, а сейчас обратил внимание: в случае, когда готовой атомарной операции нет, компилятор генерирует полноценный CAS-цикл
0
|
||||||||||||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
|
||||
| 26.09.2026, 20:22 | ||||
|
Добавлено через 2 минуты Т.е. - биты с 0-го по 3-й - записались, а с 4-го по 31-й - ещё не записались? Это на какой архитектуре такое по вашему может произойти? На x86? на ARM? ...? Добавлено через 2 минуты ![]() И поэтому может пересечься с другой MOV, направленной в ту же переменную в другом потоке???
0
|
||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||
| 26.09.2026, 20:28 | |||
|
Не по теме:
Или это уже совсем ЖЫРНЫЙ флудинг пошел? Мне действительно интересно - может я уже теряю связь с какими-то скрытыми смыслами в русском языке. Обращаясь к участникам форума: в цитате
0
|
|||
| 26.09.2026, 20:28 | |
|
исследование volatile int\ volatile int \ const int
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|