|
1 / 1 / 0
Регистрация: 03.08.2017
Сообщений: 205
|
|||||||||||
Имеет ли смысл создавать volatile переменную16.09.2026, 11:08. Показов 14306. Ответов 171
У меня есть функция
0
|
|||||||||||
| 16.09.2026, 11:08 | |
|
Ответы с готовыми решениями:
171
1 класс имеет переменную указатель на 2, 2 имеет на 1 Применение описателя Volatile Пример использования спецификатора volatile |
|
Вездепух
13234 / 6866 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
||
| 28.09.2026, 20:08 | ||
|
Ещё раз: для того, чтобы синхронизация на основе тупой записи/проверки volatile переменных работала, нужен не просто "ordering", а total ordering, то есть все операции записи-чтения должны выполняться с memory_order_seq_cst. Ни одна платформа вам такого "из коробки" не гарантирует. "Из коробки" на некоторых платформах вы получаете только acquire/release семантику. Это хороший и весьма сильный ordering. На его основе можно построить корректные синхронизационных примитивы. Но это будет совсем не тупое "записал/проверил переменную".
1
|
||
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
|
| 28.09.2026, 21:11 | |
|
TheCalligrapher, спасибо, понял.
В общем - если подытожить. Что, в общем то вы уже давным давно сделали имеем два подхода в программировании: 1 - условно железячный. Досконально изучаем архитектуру платформ и все её тонкости и используем эти знания в программировании. Принимая на веру, что оно работает именно так и что во всём досконально разобрались. Язык здесь чисто как средство перенести систему команд процессора на более высокий уровень. А стандарт вторичен. Поэтому на его гарантии плевать, главное в коде "отобразить" систему команд. 2 - стандартный Пишем код согласно стандарту, не принимая в расчёт систему команд и прочие низкоуровневые вещи. Сам язык даёт гарантии своего поведения. Ответственность за правильную реализацию и корректность поведения, согласно стандарту, перекладывается на разработчиков компиляторов. Какому пути следовать - пусть каждый решает сам. но чёт мне кажется, что большинство выберут второй путь. Особенно в коммерческой разработке. В своих же проектах каждый волен извращаться как хочет.
0
|
|
|
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
|
||
| 28.09.2026, 22:53 | ||
|
И ответственности ни кто не несёт. И в закорючках redex, я ни чего не понимаю. Это называется гавном бросаться. Надеюсь это вам не составило труда. Вообще искуственный интеллект в логике не силён и лажает сильно... ======== WinApi для винды, волшебная вещь. И оно не пишеться новое, не меняеться (deprecated), каждый год. Насколько волшебное? Извиняюсь... То что мы здесь делаем называеться публиковать. Я совсем не уверен, что надо всё публиковать. Не ломаю программы. Пишу обёртки. Добавлено через 25 минут Royal_X, Ты тоже тролль ещё тот... Мне такую хрень все пишут всё время. И ни чего конструктивного. И я тоже тролль. Потому что ни хрена мне не надо. Так, делать не чего...
0
|
||
|
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
|
|
| 28.09.2026, 23:19 | |
|
0
|
|
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
|||
| 29.09.2026, 00:08 | |||
![]() описание функций можно вот тут смотреть cppreference.com тут и С и С++ и лишней "воды нет", а ещё есть примеры. ну и да - я хреново знаю сишную часть стандартной либы С++. Очень редко приходится пользоваться. Код будет максимально эффективным и производительным. Лично я сходу не смогу - надо почитать описания, какую функцию лучше вызвать и почему. Там ведь могут быть варианты...
0
|
|||
|
Заблокирован
|
||||||||
| 29.09.2026, 00:45 | ||||||||
|
Допустим, для самой банальной функции имеем:
Ну разве что можно обойтись без документации, когда одну и ту же функцию или кусок кода ты используешь часто и знаешь уже наизусть или просто есть готовый кусок. В таких случаях, конечно, работа идет быстрее. Например, у меня уже есть целая коллекция разнообразных кусков кода для всяких задач на WinAPI и я их просто переиспользую. Смотреть в документацию не стыдно и это вовсе не признак тупости. Наоборот, умный программист потратит 5 мин и не поленится посмотреть в доку, тогда как тупой программист напишет что-то по памяти и потом будет 2 часа сношаться с ошибками.
0
|
||||||||
|
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
|
|
| 29.09.2026, 03:36 | |
|
wcsrchr - строковая функция для широких строк. UTF16. Есть аналог - strrchr для узких строк.
Она устанавливает указатель на найденный символ с права. Отправная буковка "r". Без буковки "r" - wcschr поищет знак с лева. Если туда, вместо знака вставить нультерминатор, то строка на этом месте закончиться и можно туда - wcscat(), (конкатенация строк) привинтить что нибудь другое. Могу посчитать символы, между указателями - wcslen()/ strlen(). Или модернизировать часть строки memcpy() например. Или strncpy(). Отправная буковка - "n" - number... Несколько знаков без нуль терминатора. Вот эти указатели, устанавливаемые на знаки, можно подвергать арифметике. Номерное сравнение двух знаков в стоке с константой "20" wcsncmp(end_of + wcslen(end_of) - 4, L"20", 2) == 0) wcsncmp(здесь вычисляемый указатель На память помню всё... А вы мне все пишете - std::filesystem. Нахрена она мне впала? И Redex аналогично.
0
|
|
|
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
|
|
| 29.09.2026, 04:36 | |
|
0
|
|
| 29.09.2026, 22:06 | |||
|
0
|
|||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||
| 29.09.2026, 22:33 | ||
|
Для большинства остальных практических задач конкурентного программирования нужна сихронизация, т.к. там важен порядок.
0
|
||
|
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
|
|
| 30.09.2026, 07:41 | |
|
Наталья8, пасиб за ликбез
0
|
|
|
Вездепух
13234 / 6866 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
|||||||
| 30.09.2026, 08:18 | |||||||
global_variable - обычная глобальная переменная, не volatile, не _Atomic).Если переменная stop_flag является _Atomic, то в странслированном коде программы присваивание global_variable = 42 будет гарантировано выполняться до присваивания stop_flag = 1. Если же переменная stop_flag является просто volatile, то присваивание global_variable = 42 запросто может быть перенесено компилятором и выполнено после присваивания stop_flag = 1. Обратите внимание, что в данном случае речь идет совсем не о странных аппаратных переупорядочениях, контролируемых всякими memory_order_..., а о банальном чисто языковом порядке выполнения операций в рамках оптимизационного правила "as-if".То есть поток, ожидающий команду прерваться через переменную stop_flag = 1 ее получит - для этого достаточно атомарности записи и чтения stop_flag. Однако вполне может оказаться, что этот завершающийся поток напоследок еще собирается сделать какие-то прощальные телодвижения в расчете на то, что global_variable равно 42. А это может оказаться не так.Чтобы решить эту проблему в случае volatile stop_flag вам придется сделать global_variable тоже volatile. А это криво и косо, ибо тотально подавит все оптимизации для этой переменной. _Atomic переменные решают эту задачу по-другому: вводят понятие барьера, при пересечении которого все переменные, доступные другим потокам, могут "необъяснимо поменяться". Пока такой барьер не пересекается, работу с переменной можно оптимизировать обычным образом.
0
|
|||||||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||||
| 30.09.2026, 13:07 | ||||
|
Я понимаю, что вы говорите только об оптимизация компилятора, но в контексте синхронизации они не существуют отдельно от оптимизаций аппаратных и должны решаться комплексно. Но в целом ваш посыл понятен: если плохо представляете, что делаете, используйте "дефолтную" семантику. Добавлено через 1 час 30 минут
0
|
||||
|
1519 / 534 / 78
Регистрация: 22.09.2023
Сообщений: 1,701
|
||
| 30.09.2026, 15:51 | ||
|
0
|
||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||
| 30.09.2026, 17:35 | ||
|
0
|
||
| 30.09.2026, 18:22 | |||||||||
Да, ну и какие мнения насчет использования все-таки НЕ атомарного stopFlag? Есть ли в этом какой-то смысл, его обычно проверяют часто. Хотя синхронизация настолько легка/приятна что копаться дальше не хочется
0
|
|||||||||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
|||
| 30.09.2026, 18:58 | |||
|
Для описанного вами примера, достаточно писать в flagStop с семантикой memory_order_release, а читать с семантикой memory_order_acquire. Но зная ваше пристрастие к всяким теоретизированиям, там может появится третий поток и дополнительные состояния. В итоге, наш стоп флаг затеряется в монструозной lock-free структуре с hazard pointers и т.д. и т.п. Так что специально для вас, рекомендую использовать семантику по умолчанию. Не по теме: А всем любитетлям срывать покровы с запретов я могу лишь пожелать никогда не встретить на своем пути табличку с надписью "Не есть желтый снег!".
0
|
|||
|
Вездепух
13234 / 6866 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
|
|||
| 01.10.2026, 09:30 | |||
|
Если на минутку отвлечься от темы конкурентного упорядочения памяти, а рассматривать только компиляторные "деоптимизации", то различия между этими двумя вариантами сводятся к разнице в том, "что" и "когда" деоптимизируется: volatile: Что: деоптимизируются только volatile переменные Когда: всегда - при любом доступе к такой пременной _Atomic: Что: все переменные, картина aliasing которых не ясна компилятору (т.е. для которых компилятор не может доказать, что они не поменяются конкурентно) Когда: только при пересечении сответствующего барьера Какой способ тут лучше? У каждого варианта есть свои преимущества и недостатки. (Опять же - закрывая глаза на другие критически важные свойства _Atomic, которых volatile просто не имеет. Как только мы открываем на них глаза, тогда - _Atomic без вариантов). Бороться с нежелательными деоптимизациями придется и там, и там. И способы борьбы одинаковые - забирать вычисления в отдельную переменную: не глобальную, не volatile, и алиасинг которой ясен компилятору, см. опять же #44. Вы говорите, что сброс в память "всех" переменных - это якобы проблема. Не думаю. На самом деле этих несброшенных переменных в каждый момент - одна-две. И это при том, что сбрасывать переменные в память компилятор и так будет много и часто безо всяких барьеров. Достаточно просто вызвать функцию из другой ТС, определение которой компилятору не видно и семантика которой не ясна. Добавлено через 3 минуты Да, мы уже рассматривали код, генерируемый для std::atomic, и видели, что там ничего лишнего не появляется. Но все равно для пущей чистоты экперимента с именно встроенными операторами я прицепился именно к _Atomic.
0
|
|||
| 01.10.2026, 14:04 | |||||
0
|
|||||
|
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
|
||
| 01.10.2026, 16:30 | ||
|
Igor3D, я понимаю, что вы активно кодили еще во времена до С++11, когда многопоточность еще не была стандартизтрована и каждый выкручивался как мог.
Но с тех пор прошло много времени, компиляторы сильно изменились, железки стали в сотни раз сложнее и быстрее (на вашем смартфоне все те фокусы уже не прокатят). А стандартный С++ позволяет вам писать априори корректный конкурентный код, а не эмпирически. Причем все те "приемчики", которыми вы жаждите поделиться, легко переписываются на стандартный с++ без какого-либо ущерба. Ну нет никакого смысла копаться в сортах UB. (Разве что ради поддержки legacy, хотя, сейчас можно попросить ИИ все переписать). Не по теме:
Добавлено через 4 минуты Добавлено через 26 минут
0
|
||
| 01.10.2026, 16:30 | |
|
исследование 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.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|