|
1 / 1 / 0
Регистрация: 03.08.2017
Сообщений: 205
|
|||||||||||
Имеет ли смысл создавать volatile переменную16.09.2026, 11:08. Показов 13581. Ответов 171
У меня есть функция
0
|
|||||||||||
| 16.09.2026, 11:08 | |
|
Ответы с готовыми решениями:
171
1 класс имеет переменную указатель на 2, 2 имеет на 1 Применение описателя Volatile Пример использования спецификатора volatile |
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||
| 20.09.2026, 19:27 | ||
|
0
|
||
| 20.09.2026, 19:30 | ||
|
Не по теме:
в разделе низкоуровневого программирования я тебе никогда не видел. Сейчас же, когда появился ИИ, ты активно ассемблерными кодами кидаешься... для меня ты всегда ассоциировался с человеком, который 7 раз прочтет стандарт С++ и только потом ответит. Т.е. я знал, что написанным тобой утверждениям можно верить и ничего не проверять. Чёт не в твоем стиле, что-то ляпнуть. Эх, сдаешь позиции.
0
|
||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 842
|
||
| 20.09.2026, 19:40 | ||
|
Хотя для синхронизации потоков они наверное малополезны. Лучше откройте систему команд x86 - я уже не очень хорошо её помню.
0
|
||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||||||||||||
| 20.09.2026, 19:46 | |||||||||||||
Добавлено через 4 минуты Не надо притворяться, что вы не понимаете, о чем шла речь. Речь шла о копировании значения одной пользовательской переменной в другую пользовательскую переменную без использования промежуточного хранилища, каким бы оно ни было. Использование стека в качестве промежуточного хранилища ничем не лучше использования регистра в качестве промежуточного хранилища.
0
|
|||||||||||||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 842
|
|||
| 20.09.2026, 20:04 | |||
|
Я выше привёл пример кода реализующего такую синхронизацию. Где и зачем там нужны операции "память-память"?
0
|
|||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||||
| 20.09.2026, 20:11 | |||||
|
Не по теме:
Добавлено через 2 минуты
0
|
|||||
| 20.09.2026, 20:23 | |
|
0
|
|
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||||||||||||||||||
| 21.09.2026, 00:48 | ||||||||||||||||||
|
Добавлено через 11 минут
restrict, а в С++ все по-старому.Добавлено через 4 часа 11 минут Не по теме:
1. В сообщении #22 вы говорите, что volatile переменная не будет копироваться в регистр. 2. В сообщении #23 пользователь Алексей1153 в качестве возражения приводит пример кода, в котором volatile переменные загружаются в регистры. 3. В сообщении #24 я выступаю в вашу поддержку: я замечаю пользователю Алексей1153, что данная загрузка в регистр - это не замена/кэширование переменной в регистр, очевидно подразумевавшаяся вами в посте #22, а сиюминутная промежуточная загрузка, необходимая лишь потому, что в системе команд x86 нет команд "память - память" (т.е. команд "пользовательская переменная - пользовательская переменная"). 4. Вы соглашаетесь с этим в посте #27 5. При этом в том же посте #27 и далее вы непонятно зачем начинаете разводить посторонний флуд о том, что команды "память - память" в системе команд x86 есть, форся какие-то примеры команд, которые никак не относятся к исходной ситуации из поста #22. 6. И в конечном итоге вы, кажется, вообще потеряли нить и забыли, о чем шла речь, что видно из вашей цитаты выше. Что это? К чему здесь этот флуд? ¯\_(ツ)_/¯
1
|
||||||||||||||||||
| 21.09.2026, 00:57 | |||||
Он ужасно корявый. Ну да ладно, наша тема volatile. Верю что подобный код "всю жизнь работает", а может даже на каком-то компиляторе volatile необходим. Но по классике
0
|
|||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||
| 21.09.2026, 01:39 | ||
lock для атомарности. А для случая нескольких ядер все еще держится на дополнительных гарантиях платформы x86 на тему когерентности памяти.Однако все это не имеет никакого отношения к С++. И, что важно, никаких преимуществ перед штатными средствами организации атомарного доступа не предоставляет, особенно если учесть тонкости оптимизации доступа, описанные мною выше.
0
|
||
| 21.09.2026, 03:29 | |||||||
|
Да, и вот хороший вопросик. Есть команда (синтаксис могу путать)
0
|
|||||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
|||||
| 21.09.2026, 04:11 | |||||
mov. То есть если один поток записывает переменную, а другой читает, то читающий не прочитает наполовину записанную переменную. Читающий прочитает либо полное значение до записи, либо полное значение после записи. Таким же свойством на x86 обладает инструкция xchg. Это указано в спецификации платформы.Например, компилятор Clang транслирует инкременты и декременты volatile переменной в примере из поста #23 именно в inc qword ptr [rax] и dec qword ptr [rax] без префикса lock, то есть именно так, как вы и хотели. Однако в результате в этом примере мы не получаем нуля в финале, ибо эти инструкции "мешали" друг другу, то есть выполнялись неатомарно.lock? Без lock будет не атомарно. Clang генерирует lock inc qword ptr [rax] для std::atomic<> то есть именно ваш вариант, но с префиксом lock. GCC предпочитает lock add QWORD PTR [rax], 1.
0
|
|||||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 842
|
|||||||||
| 21.09.2026, 06:57 | |||||||||
|
На кой там сдались какие-то команды память-память? Вы понимаете логику выполнения того кода??? У меня складывается впечатление, что не понимаете. Добавлено через 4 минуты ![]() Тогда такая подгонка (вашими словами) возможна на любой архитектуре. Потому как на любой архитектуре есть типы данных с атомарной чтение и записью. Заменить в коде int-ы на эти типы и всё будет работать. Также тут некоторыми авторами утверждалось, что volatile невозможно использовать для такой синхронизации. Я привёл пример опровергающий. Что ещё нет так? Вопрос закрыт? volatile-перменную можно использовать для межпоточной синхронизации? Или сколько ещё будем переливать из пустого в порожнее? Добавлено через 5 минут А команды записи и чтения int - атомарны (на той же архитектуре). Хоть с точки зрения одного ядра, хоть с точки зрения многоядерности. И lock им не нужен. Добавлено через 2 минуты Как именно XCHG (без lock) может быть атомарной, если она выполняет 2 отдельные транзакции по шине: чтение + запись? Добавлено через 15 минут Добавлено через 1 минуту Почитайте хоть какие-то учебники по "атомарности", по архитектурам и операциям в них. Как видно из ваших постов - вы совершенно плаваете в этой теме. Когда почитаете, разберётесь, тогда и поймёте мой пример.
0
|
|||||||||
|
Вездепух
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
|
||||
| 21.09.2026, 07:43 | ||||
|
На уровне машинного кода атомарность обеспечивается не типом, а операцией. Именно операция должна быть атомарной, а на тип лишь налагаются побочные требования, вроде размера и выранивания. Либо это будет специальная операция, либо это будет специальный модификатор операции (вроде lock на x86).То, что на x86 внезапно оказалось, что обычные "повседневные" операции mov и xchg даже без lock работают атомарно - это удивительно волшебное уникальное стечение обстоятельств (возможно, являющееся следствием какого-нибудь застарелого костыля в дизайне), которое на других платформах иметь места не будет. Работоспособность вашего куда с volatile держится случайно-чудесным образом на том, что использованные вами операции натуральным образом странслируются именно в mov. Именно mov чаще всего используется для реализации присваивания на x86 (а ваш код содержит только присванивания). Компилятор при этом не пытался достичь атомарности. Он о ней вообще не думал. Компилятор просто использовал обычный mov, который побочно оказался атомарным. На другой платформе компилятор точно также будет использовать "обычные" повседневные операции при работе с volatile переменной. Которые в общем случае атомарными не будут. Поэтому разглагольствовать на тему того, что что там есть и чего там нет - бесполезно. Компилятор не будет заниматься обеспечивать атомарность - ее и не будет.И это даже еще не говоря о когерентности памяти в случае наличия нескольких ядер. То, что x86 обеспечивает это "автоматически" - еще одна уникальная удивительная волшебная особенность x86, которой на других платформах не будет. xchg тоже неявно атомарна ![]() https://www.reverseengineering... embly/xchg
0
|
||||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 842
|
||||||
| 21.09.2026, 08:03 | ||||||
|
Попробуйте ещё раз прочитать вами же процитированное: Если не можете привести - то и разглагольствовать нечего. Это к тому, кто тут занимается "на лету поиском информации в инете". Чья бы мычала, а ваша бы помолчала. ![]() Гура, с толпами воображаемых "учеников", не знающий даже основ системы команд обсуждаемой архитектуры. ![]() PS: Вобщем - имеющие голову, поймут написанный мной пример с синхронизацией на volatile-переменных. Тролли и пустозвоны - проходите мимо. Более тут осбуждать нечего. Адьё!
0
|
||||||
| 21.09.2026, 08:10 | |
|
Не по теме: ¯\_(ツ)_/¯ Я думаю, что тут все уже безнадежно... Бесполезно тратить время.
0
|
|
|
391 / 336 / 66
Регистрация: 14.10.2014
Сообщений: 1,537
|
|||||||
| 21.09.2026, 08:37 | |||||||
|
Если да, то разве там
P.S. Если что - я не набрасываю, просто хочу разобраться. Во всяких умны книжках по С++, обычно, призывают использовать всякие мьютексы и прочие примитивы синхронизации. Чтоб гонок за данные не было и прочих нежелательных эффектов. А вы своим примером сообщаете, что это нафиг не нужно..... я в ступоре ![]() Сам не сильно в этих стандартах и прочих мануалах для С++ разбираюсь. Наверное, надо идти учить ассемблер
0
|
|||||||
|
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 842
|
|||
| 21.09.2026, 09:04 | |||
|
Что и демонстрирует приведённый пример. Который будет нормально работать как под Win, так и например на двухъядерном ARM вообще без какой-либо ОС. Где каждый из "потоков исполнения" - это просто super-loop в main(). Где вы на такой системе найдёте мьютекс? Под Win иногда пишу. И стараюсь поменьше использовать мьютексы, критические секции и т.п. тяжёлые средства синхронизации. В большинстве случаев стараюсь обойтись либо Interlocked-функциями либо иногда вообще подобно этому - чисто на volatile-переменных. Естественно volatile не отменяет необходимости барьеров и пр. средств. Там где они нужны. Но в том коде они не нужны.
0
|
|||
|
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 903
|
||
| 21.09.2026, 12:32 | ||
|
если нет ОС - можете мьютекс сделать на атомиках - нормально работает, просто ресурсы в пустую кушает. а volatile для процессора это обычная работа с памятью - ибо это только инструкция для компилятора. если у вас такая простая ситуация что нет гонки данных и всё получается на интерлоках - да пожалуйста пишите как хотите. Но из своего опыта могу сказать что гораздо удобнее один раз написать более высокоуровнемый блок обмена информацией в многопотоке - который допускает гонку и иного потоков и много процессоров и более к вопросу о примитивах синхронизации не возвращаться. Я такой блок даже в однопотоке использую - ибо просто удобно.
0
|
||
| 22.09.2026, 08:25 | |||
|
- Использование локальной переменной "i" непонятно. Может "так заработало, не трогай и не дыши!"? Угадал? ![]() - Реализация Sleep имеет фиксированное/константное время задержки. Это источник забот, и так Вы признаете что ни на какую оптимальность не претендуете, абы работало. - нет кода завершения/отмены, иногда требуется и suspend/resume, ну то ладно, это пример Как надо было делать. В многопоточности есть схемы/табии что подходят для массы задач, в том числе и для Вашего примера. Напр в справочнике посмотрите std::condition_variable::notify_all, переделать тамошний примерчик несложно. По сути он переписывается тысячекратно, схема одна и та же. Возможно Вы скажете или подумаете
Придет понимание что если уж велик - то лучше/быстрее типового решения, придет умение подсчитывать во что этот велик обойдется и.т.д. Хотя, судя по Вашему поведению, это будет не скоро
0
|
|||
| 22.09.2026, 08:25 | |
|
исследование volatile int\ volatile int \ const int
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
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.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|