|
1 / 1 / 0
Регистрация: 03.08.2017
Сообщений: 205
|
|||||||||||
Имеет ли смысл создавать volatile переменную16.09.2026, 11:08. Показов 15127. Ответов 171
У меня есть функция
0
|
|||||||||||
| 16.09.2026, 11:08 | |
|
Ответы с готовыми решениями:
171
1 класс имеет переменную указатель на 2, 2 имеет на 1 Применение описателя Volatile Пример использования спецификатора volatile |
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 858
|
|||||||
| 22.09.2026, 10:57 | |||||||
|
Добавлено через 14 минут ![]() А когда вы применяете мьютекс или критическую секцию или ещё какое другое средство сериализации доступа к общему разделяемому ресурсу, то как вы думаете - как будут выполняться задачи? Это называется: Сериализация доступа. Для коей собственно и применяются все обсуждаемые средства синхронизации. Как вы думаете - для чего созданы все средства межпоточной синхронизации? С какой целью? Ищите учебник и по пунктам изучайте: какие способы межпоточной синхронизации бывают; какие применимы для задач в пределах одного CPU, а какие - для межъядерной синхронизации; что такое "сериалиализация доступа к разделяемому ресурсу"; поддержка средств синхронизации со стороны архитектуры и системы команд на различных архитектурах; и т.д. Когда освоите основы, тогда может и сможете понять как работает мой пример. Пока он для вас бесполезен.
0
|
|||||||
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
|
| 22.09.2026, 11:53 | |
|
Так, господа знатоки! Проанализировав данный пример ещё раз
И прочитав ответ jcxz, на мой предыдущий пост Лично я пришёл к выводу, что размышления, как и пример, предоставленный jcxz, корректны. (Если чё - я ни разу не знаток С++ ) И весь jcxz, размышляет на низком уровне - по сути на уровне программирования bare-metal систем. Ему же оппонируют знатоки высокоуровневого программирования. Отсюда и разногласия. Потому что пример и комментарии к нему от автора кода, на который я ссылаюсь в данном сообщении - прекрасно будет работать во встроенных системах (а возможно там по-другому и никак не сделать). Но в высокоуровневом современном программировании в системах с полноценной операционкой, где будет полностью выполняться абстрактная модель С++, данный пример категорически неприемлем - то есть некорректен. P.S. Ага - вижу - вон они - уже стартанули - гнилые помидоры и ссаные тряпки в мою сторону
0
|
|
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 858
|
|||
| 22.09.2026, 13:28 | |||
|
И да - ТС нигде не писал, на какой платформе он программирует. Может быть какая угодно, вплоть до Абдурины.
0
|
|||
|
Нарушитель
6691 / 3079 / 1064
Регистрация: 01.06.2021
Сообщений: 11,872
|
|||
| 22.09.2026, 15:43 | |||
|
Поэтому и говорят "Никогда не спорьте с дураками. Они потянут вас вниз до своего уровня и побьют вашим же опытом." Спорить с дураками это самая большая ошибка, что может быть. Потому что дурак всегда выиграет в таких спорах, ведь он же собаку съел в написании дуростей. Если же вернуться в данную тему, то тут, как по мне, дураков нет (как-никак это приличный форум), но всё же есть некоторые личности с неприятными качествами. По этому поводу можно процитировать одну армянскую притчу:
Если рассказать немного из моей жизни, то лично знаком со спортсменом с медальками европейского масштаба, который положит в одиночку целую стаю мужиков, но он в жизни такой скромный и даже когда обижают, то он даже не лезет сразу в драку как петух, а мирно объясняет свою правоту. Аналогично, знаком в реальной жизни с очень богатым челом, но по внешнему виду даже не скажешь, что он богач. Одевается опрятно, но без показушных брендов.
0
|
|||
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
||||||||||||||||||
| 22.09.2026, 16:55 | ||||||||||||||||||
volatile — (насколько я знаю, но при этом не претендую на истину) - только про запрет оптимизаций компилятора в рамках одного потока. То есть (опять же - как это я понимаю) если есть два потока, то они запросто поломают state, а значит и полагаться на корректность исполнения данного кода уже нельзя. А вот с
Вот как то так.
0
|
||||||||||||||||||
|
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 40
|
|||||||||||
| 22.09.2026, 18:22 | |||||||||||
|
Recrut_rf, согласен с Вашей точкой зрения. У С.Маейрса именно так и и обьяснялась разница между двумя этими вариантами - один для работы с особыми видами памяти и запретом на оптимизации, второй - именно для атомарных операций. И даже было уточнение, что даже если какие-то компиляторы и позволяют использовать volatile переменную в атомарных операциях (и это даже работает), то это не стандартное поведение и надеяться на то, что так будет при компиляции другим компилятором не стоит.
Ну и к примеру, если просмотреть ассемблерный код с инкрементом переменных двух видов, там четко видно, что используются совершенно разные команды, что само по себе наводит на мысль, что это не спроста. Если бы не было разницы, с чего бы компилятору генерировать разный ассемблерный код? Вот такой простой код
0
|
|||||||||||
|
Нарушитель
6691 / 3079 / 1064
Регистрация: 01.06.2021
Сообщений: 11,872
|
|
| 22.09.2026, 19:32 | |
|
0
|
|
|
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 40
|
||
| 22.09.2026, 19:43 | ||
|
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
||||||||||||
| 22.09.2026, 19:50 | ||||||||||||
|
--- Очевидно, так оно и есть. Зачем? В реальности ваш код транслируется вот так: GCC:
lock для атомарной переменной, т.е. все в точности так же, как мы уже видели в вышеупомянутых постах. Именно благодаря этому префиксу инкремент для атомарной переменной работает правильно (атомарно), а для volatile - не работает правильно (выполняется неатомарно).
0
|
||||||||||||
|
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 40
|
||||||||
| 22.09.2026, 20:06 | ||||||||
0
|
||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
|||
| 22.09.2026, 20:17 | |||
|
Как уже наглядно демонстрировалось выше, никакого атомарного поведения volatile переменной в таких операциях, как инкремент, не получится. А атомарное поведение в простых присваиваниях - возможно, но это не более чем баг-о-фича конкретной аппаратной платформы, которая на уровне языка является лишь случайным совпадением. На уровне языка это совпадение никому нинафиг не нужно. Но есть некоторые необучаемые индивидуумы, которым это случайное совпадение - дороже любимого котенка. Им хоть кол на голове теши. Однако это - стандартная ситуация в интернет форумах. Все уже привыкли.
1
|
|||
|
Нарушитель
6691 / 3079 / 1064
Регистрация: 01.06.2021
Сообщений: 11,872
|
|||
| 22.09.2026, 21:26 | |||
|
Но вот я смотрю на посты из этой темы (не офтопные, а те, где якобы отвечают), и не могу понять, какая связь с вопросом ТС: и если что, ТС не какой-то там бот, который создал тему и пропал. Сегодня замечал, как он наблюдал за темой (внизу страницы показывает). Т.е. человек по-прежнему следит за темой и наверное в шоке от того, что тут вообще обсуждают...
0
|
|||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
||
| 22.09.2026, 22:17 | ||
|
0
|
||
|
Нарушитель
6691 / 3079 / 1064
Регистрация: 01.06.2021
Сообщений: 11,872
|
||
| 22.09.2026, 22:49 | ||
|
Если даже код ТС (кусок которого он показал) работает, то наверное в целом он выглядит так:
0
|
||
| 22.09.2026, 23:00 | ||
|
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
||||
| 22.09.2026, 23:20 | ||||
Сообщение было отмечено Igor3D как решение
РешениеТут даже программу писать не нужно. Просто бери готовое и запускай! Но нет же - продолжается всякое "по-моему"... inc в процессоре, очевидно, реализуется как RMW-последовательность. Если элементы R, M, W выполняются не атомарно как единое целое, то два потока могут прочитать из переменной значение 0 (оба), увеличить его до 1 (оба) и записать обратно в память значение 1 (оба). В результате после двух параллельных инкрементов в переменной не получится ожидаемого правильного значения 2, а получится неправильное значение 1.Где вам тут видится "верная сумма"? inc/dec. Различие лишь в наличии lock. Без lock результат неправильный, а с lock - правильный. Просто попробуйте и посмотрите своими глазами. Не надо слепо теоретизировать.
0
|
||||
| 22.09.2026, 23:52 | |||
Вот она где, "неатомарность"Добавлено через 2 минуты Не по теме:
Добавлено через 2 минуты
0
|
|||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 858
|
||||||||
| 23.09.2026, 13:46 | ||||||||
|
При условии, что операции записи и чтения int на платформе - атомарны. Имхо - такой ситуации просто не существует. А вы страхуетесь от сферических коней в вакууме. Ваш std::atomic<int> нужен для RMW-операций. Коих в моём коде просто нет. Ну или докажите обратное: Какие команды в какой последовательности должны быть выполнены разными потоками, чтобы это привело к нарушению работы моего кода? Добавлено через 5 минут При условии, что int - выровнена (как в моём коде). Не надо выдумывать сферических коней в вакууме. Приведите конкретный пример. Если конечно разбираетесь в теме. Добавлено через 2 минуты И не валим с больной головы на здоровую. Добавлено через 2 минуты Добавлено через 2 минуты Можете привести пример компилятора, который на платформе x86 выполнит неатомарное присваивание выровненной int-переменной? И как именно он это сделает? Побитово что-ли её присвоит??? ![]() Добавлено через 1 минуту Есть что по делу сказать?
0
|
||||||||
|
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 40
|
||
| 23.09.2026, 15:05 | ||
|
0
|
||
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
||
| 23.09.2026, 15:43 | ||
![]() если принять на веру, что операции чтения и записи на платформе атомарны и, используя volatile, образно, говорим компилятору что не надо state никак оптимизировать (ну там не знаю - хранить в регистре, как то в памяти его перекладывать и прочие вещи творить) - тогда да, признаю что код корректен.И в ваших условиях всё нормально отработает - мы ведь пишем атомарно, читаем атомарно И вы правы в своих рассуждениях. НО!!!!!Но, в чём лично у меня претензии к вам и к вашему коду? Вы утверждаете, что он абсолютно корректен и нормально отработает. И тут я даже спорить с вами не буду - всё так. Корректно отработает. Но только при тех условиях, которые вы сами перечислили - что в данной системе будут атомарные операции чтения и записи. Но ведь обычный / стандартный / без всяких плагинов расширений и прочих компиляторных фич С++ таких гарантий НЕ ДАЁТ!!!! А далее - представьте себе (ведь этот раздел форума для начинающих - кто за знаниями сюда приходит) - заходит такой начинающий в эту тему и видит: "Хммм умные дядьки, шарящие в плюсах, утверждают что volatile нужен для синхронизации между потоками и вообще - полезен в многопоточности, ещё и пример есть, да и куча умных слов: RMW-операцией, XADDL, регистры, ассемблер. Запоминает всё это (в основном крутые и непонятные обозначения да и то - половину Ну и само собой - используешь многопоток - применяй volatile ) А в саму суть нифига не вникает - потому что в потоках срача данной темы не щарящий мало что полезного для себя найдёт" Пойдёт на собес, чувствуя себя "Д'Артаньяном среди плюсов" и лихо так обделается - ЖИДКО, СМАЧНО - МОЖ ДАЖ НА ВСЮ ЖИЗНЬ ЗАПОМНИТ , особенно если будет ссылаться на умных дядек с киберфорума
0
|
||
| 23.09.2026, 15:43 | |
|
исследование volatile int\ volatile int \ const int
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|