|
1 / 1 / 0
Регистрация: 03.08.2017
Сообщений: 205
|
|||||||||||
Имеет ли смысл создавать volatile переменную16.09.2026, 11:08. Показов 15755. Ответов 171
У меня есть функция
0
|
|||||||||||
| 16.09.2026, 11:08 | |
|
Ответы с готовыми решениями:
171
1 класс имеет переменную указатель на 2, 2 имеет на 1 Применение описателя Volatile Пример использования спецификатора volatile |
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 862
|
|||||||
| 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
Сообщений: 862
|
|||
| 22.09.2026, 13:28 | |||
|
И да - ТС нигде не писал, на какой платформе он программирует. Может быть какая угодно, вплоть до Абдурины.
0
|
|||
|
Нарушитель
6701 / 3115 / 1064
Регистрация: 01.06.2021
Сообщений: 12,026
|
|||
| 22.09.2026, 15:43 | |||
|
Поэтому и говорят "Никогда не спорьте с дураками. Они потянут вас вниз до своего уровня и побьют вашим же опытом." Спорить с дураками это самая большая ошибка, что может быть. Потому что дурак всегда выиграет в таких спорах, ведь он же собаку съел в написании дуростей. Если же вернуться в данную тему, то тут, как по мне, дураков нет (как-никак это приличный форум), но всё же есть некоторые личности с неприятными качествами. По этому поводу можно процитировать одну армянскую притчу:
Если рассказать немного из моей жизни, то лично знаком со спортсменом с медальками европейского масштаба, который положит в одиночку целую стаю мужиков, но он в жизни такой скромный и даже когда обижают, то он даже не лезет сразу в драку как петух, а мирно объясняет свою правоту. Аналогично, знаком в реальной жизни с очень богатым челом, но по внешнему виду даже не скажешь, что он богач. Одевается опрятно, но без показушных брендов.
0
|
|||
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
||||||||||||||||||
| 22.09.2026, 16:55 | ||||||||||||||||||
volatile — (насколько я знаю, но при этом не претендую на истину) - только про запрет оптимизаций компилятора в рамках одного потока. То есть (опять же - как это я понимаю) если есть два потока, то они запросто поломают state, а значит и полагаться на корректность исполнения данного кода уже нельзя. А вот с
Вот как то так.
0
|
||||||||||||||||||
|
5 / 3 / 2
Регистрация: 21.09.2026
Сообщений: 47
|
|||||||||||
| 22.09.2026, 18:22 | |||||||||||
|
Recrut_rf, согласен с Вашей точкой зрения. У С.Маейрса именно так и и обьяснялась разница между двумя этими вариантами - один для работы с особыми видами памяти и запретом на оптимизации, второй - именно для атомарных операций. И даже было уточнение, что даже если какие-то компиляторы и позволяют использовать volatile переменную в атомарных операциях (и это даже работает), то это не стандартное поведение и надеяться на то, что так будет при компиляции другим компилятором не стоит.
Ну и к примеру, если просмотреть ассемблерный код с инкрементом переменных двух видов, там четко видно, что используются совершенно разные команды, что само по себе наводит на мысль, что это не спроста. Если бы не было разницы, с чего бы компилятору генерировать разный ассемблерный код? Вот такой простой код
0
|
|||||||||||
|
Нарушитель
6701 / 3115 / 1064
Регистрация: 01.06.2021
Сообщений: 12,026
|
|
| 22.09.2026, 19:32 | |
|
0
|
|
|
5 / 3 / 2
Регистрация: 21.09.2026
Сообщений: 47
|
||
| 22.09.2026, 19:43 | ||
|
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||||||||||||
| 22.09.2026, 19:50 | ||||||||||||
|
--- Очевидно, так оно и есть. Зачем? В реальности ваш код транслируется вот так: GCC:
lock для атомарной переменной, т.е. все в точности так же, как мы уже видели в вышеупомянутых постах. Именно благодаря этому префиксу инкремент для атомарной переменной работает правильно (атомарно), а для volatile - не работает правильно (выполняется неатомарно).
0
|
||||||||||||
|
5 / 3 / 2
Регистрация: 21.09.2026
Сообщений: 47
|
||||||||
| 22.09.2026, 20:06 | ||||||||
0
|
||||||||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
|||
| 22.09.2026, 20:17 | |||
|
Как уже наглядно демонстрировалось выше, никакого атомарного поведения volatile переменной в таких операциях, как инкремент, не получится. А атомарное поведение в простых присваиваниях - возможно, но это не более чем баг-о-фича конкретной аппаратной платформы, которая на уровне языка является лишь случайным совпадением. На уровне языка это совпадение никому нинафиг не нужно. Но есть некоторые необучаемые индивидуумы, которым это случайное совпадение - дороже любимого котенка. Им хоть кол на голове теши. Однако это - стандартная ситуация в интернет форумах. Все уже привыкли.
1
|
|||
|
Нарушитель
6701 / 3115 / 1064
Регистрация: 01.06.2021
Сообщений: 12,026
|
|||
| 22.09.2026, 21:26 | |||
|
Но вот я смотрю на посты из этой темы (не офтопные, а те, где якобы отвечают), и не могу понять, какая связь с вопросом ТС: и если что, ТС не какой-то там бот, который создал тему и пропал. Сегодня замечал, как он наблюдал за темой (внизу страницы показывает). Т.е. человек по-прежнему следит за темой и наверное в шоке от того, что тут вообще обсуждают...
0
|
|||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||
| 22.09.2026, 22:17 | ||
|
0
|
||
|
Нарушитель
6701 / 3115 / 1064
Регистрация: 01.06.2021
Сообщений: 12,026
|
||
| 22.09.2026, 22:49 | ||
|
Если даже код ТС (кусок которого он показал) работает, то наверное в целом он выглядит так:
0
|
||
| 22.09.2026, 23:00 | ||
|
0
|
||
|
Вездепух
13235 / 6867 / 1827
Регистрация: 18.10.2014
Сообщений: 17,407
|
||||
| 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
Сообщений: 862
|
||||||||
| 23.09.2026, 13:46 | ||||||||
|
При условии, что операции записи и чтения int на платформе - атомарны. Имхо - такой ситуации просто не существует. А вы страхуетесь от сферических коней в вакууме. Ваш std::atomic<int> нужен для RMW-операций. Коих в моём коде просто нет. Ну или докажите обратное: Какие команды в какой последовательности должны быть выполнены разными потоками, чтобы это привело к нарушению работы моего кода? Добавлено через 5 минут При условии, что int - выровнена (как в моём коде). Не надо выдумывать сферических коней в вакууме. Приведите конкретный пример. Если конечно разбираетесь в теме. Добавлено через 2 минуты И не валим с больной головы на здоровую. Добавлено через 2 минуты Добавлено через 2 минуты Можете привести пример компилятора, который на платформе x86 выполнит неатомарное присваивание выровненной int-переменной? И как именно он это сделает? Побитово что-ли её присвоит??? ![]() Добавлено через 1 минуту Есть что по делу сказать?
0
|
||||||||
|
5 / 3 / 2
Регистрация: 21.09.2026
Сообщений: 47
|
||
| 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|