Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 1 / 0
Регистрация: 03.08.2017
Сообщений: 205

Имеет ли смысл создавать volatile переменную

16.09.2026, 11:08. Показов 14141. Ответов 171

Студворк — интернет-сервис помощи студентам
У меня есть функция
C++
1
2
void getParam(double &param){ //...
}
Вызов написал в таком виде:
C++
1
2
3
//...
{volatile double gain;
getParam((double&)gain);//...
Имеет ли смысл такая конструкция или лучше воспользоваться обычной переменной double?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2026, 11:08
Ответы с готовыми решениями:

1 класс имеет переменную указатель на 2, 2 имеет на 1
Имеется 2 класса. В 1 классе есть переменная-указатель на 2 класс, а во 2 классе есть...

Применение описателя Volatile
Приведите плз пример простой проги с этим описателем а то я не пойму для чего он вообще нужен?В чём...

Пример использования спецификатора volatile
В приложенной картинке (из книги Г.С. Шилдта по C++) есть пример использования спецификатора...

171
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 36
28.09.2026, 16:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Igor3D Посмотреть сообщение
Вместо этого напускают туману
На мой взгляд, тут дело не в том что, как Вы выразились, напускают туману, а в том что разбираются, по сути, два не совсем связанных случая.
Первый - это изменение какой-то переменной в разных потоках, с гарантией, что эта переменная видна во всех потоках в актуальном состоянии, и второй - это уже не про собственно переменную, а синхронизацию операций (например, работают три потока, и они должны гарантированно выводить A, B и C, и только в таком порядке). Это разные задачи, и решать их нужно немного по разному.
Тот пример, что был приведен на 2 странице данной темы, на мой взгляд, как раз относится ко второму случаю (хотя, если я его правильно понял, там просто используется т.н. холостой цикл, что не совсем верно). Если бы мне пришлось делать именно синхронизацию потоков, я бы выбрал или std::condition_variable (C++), или pthread_cond_t/pthread_barrier_t (C). Но я исхожу из задач практических, а как оно там внутри будет устроено, меня уже не так волнует.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13233 / 6865 / 1827
Регистрация: 18.10.2014
Сообщений: 17,398
28.09.2026, 17:29
Цитата Сообщение от SarJohnDoe Посмотреть сообщение
и второй - это уже не про собственно переменную, а синхронизацию операций (например, работают три потока, и они должны гарантированно выводить A, B и C, и только в таком порядке). Это разные задачи, и решать их нужно немного по разному.
Близко, но не совсем так.

Речь о семантике упорядочения памяти в данном контексте ведется не потому, что она влияет на некие посторонние абстрактные операции "выводить A, B и C", а именно о тех же самых операциях синхронизации потоков, когда у вас есть не один, а несколько таких "доморощенных" синхронизационных примитивов. То есть, например, у вас есть не одна, а три переменных - A, B и C - которые вы используете для целей синхронизации потоков через операции записи и чтения. Одни потоки записывают в эти переменные значения, скажем, 0 и 1, а другие проверяют содержимое этих переменных и на основе этого принимают решение ждать или работать дальше (0 - свободно, 1 - занято). И для того, чтобы избежать дедлоков, в ситуациях, когда потокам нужно поменять или проверить две или более таких переменных, они договорились делать это строго в заранее оговоренном относительном порядке A -> B -> C.

Без гарантий упорядочения памяти разные потоки могу "видеть" разные относительные порядки изменения значений в этих трех переменных. То, что один поток честно придерживался договоренности выставлять переменные в порядке A -> B -> C, совсем не гарантирует, что читающий поток "увидит" изменения этих переменных в том же порядке. Вышеупомянутая договоренность без гарантий упорядочения памяти просто не работает.

У меня чешется язык сказать, что если у вас используется только одна-единственная такая синхронизационная переменная (как в коде нашего волатильного синхронизатора), то подобные соображения вас не должны волновать, достаточно просто атомарности операций чтения-записи этой переменной и "все будет работать". Но на самом деле и это не так. Все равно не достаточно.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,371
28.09.2026, 17:35
Очень умные все. Наверное TheCalligrapher научил. Плохо понимаю вообще.
0
3 / 2 / 1
Регистрация: 21.09.2026
Сообщений: 36
28.09.2026, 17:36
TheCalligrapher, ну возможно, но я, как и сказал ранее, не стал бы мудрствовать лукаво, разбираясь в командах для различных архитектур (коих множество, и я в них как свинья в апельсинах), а просто использовал бы имеющиеся инструменты в С или С++, будучи уверенным, что это гарантированно работает и выполняет то и так, как я ожидаю.
Что касается гарантий упорядочивания памяти - насколько я помню, по умолчанию используется самая строгая, а это собственно даст максимальные гарантии. Ну а далее, когда все будет работать, там уже можно заниматься оптимизацией (если за это заплатят).
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,371
28.09.2026, 17:37
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Меня веселит и поражает то, что ChatGPT постоянно с уверенным видом несет чушь
А что вы ему пишете, то он и пишет в ответ. Пишите проще.
0
28.09.2026, 17:43

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
Меня веселит и поражает то, что ChatGPT постоянно с уверенным видом несет чушь
Ну думаю, что не только он. Есть у меня сейчас на руках один проект (для ОС Aurora, клон Sailfish от наших разрабов), так вот, там в том проекте практически все писали по промптам к ИИ (хотя есть несколько файлов на плюсах, что делал я и передавал команде кто занимался этим проектом). Оно вроде кое-как работает, но поддерживать и дорабатывать такое - это прям совсем невесело. Так что до полноценной замены человека ИИ еще далековато.

0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,371
28.09.2026, 17:49
Вот это мне подсказал ИИ в прошлой писанине.
Вызывать функцию рекурсивно уже с переименованным путём.
Строка 11 - 15.
Не обрабатывало сразу данные. Не заходило в переименованные папки.
Вы же ни кто не подскажете...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (if_enter) {// Если было что то изменено, переименование и вызов рекурсии с новым имянем.
 
            wchar_t new_full_Path[Home_fld]{};// Делаем полное имя с путём вместе.
            wcscpy(new_full_Path, FullPath);
            *(wcsrchr(new_full_Path, L'\\') + 1) = '\0';// Отрежем старое название добавим новое.
            wcscat(new_full_Path, new_name);
 
            if (_wrename(FullPath, new_full_Path) == 0)
                std::cout << "Folder renamed successfully!\n";
_freea(Mask);
        EnumerateFileObjects(new_full_Path);<=============================================
}
else {
_freea(Mask);// По моему перед рекурсивным вызовом самой себя там создастся ещё массив. (ИИ не согласен)
            EnumerateFileObjects(FullPath);<=============================================
    printf("------- not required -------\n"); }
А писанина это моя...
И.И. - Инструмент... Пользоваться уметь надо...
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.09.2026, 18:06
Цитата Сообщение от Наталья8 Посмотреть сообщение
Вы же ни кто не подскажете...
могу только покритиковать)) особенно, когда вместо С++ вижу "С++ в стиле С с использованием расширений Microsoft (Microsoft CRT)". Не знаю, как назвать это порно?

Этот код не кроссплатформенный, даже если он не использует Win32 API напрямую, а лишь CRT от майкрософт. К тому же, использование виндового разделителя пути L'\\' крякнет на других платформах.

А ведь можно было написать проще, на современном С++17 и кроссплатформенно:

типа вот такой псевдокод по мотивам примеров из cppreference

C++
1
2
3
4
5
#include <filesystem>
namespace fs = std::filesystem;
 
for (auto& entry : fs::recursive_directory_iterator(root)) { ... }
fs::rename(old_path, new_path);
не тестировал, писал на заборе

Цитата Сообщение от Наталья8 Посмотреть сообщение
А писанина это моя...
мог и не писать, это и так заметно
0
28.09.2026, 18:10

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
типа вот такой псевдокод по мотивам примеров из cppreference
В другой теме (именно по этому вопросу) мной приводился прямо полный код, решающий эту задачу. Но коллеге нравятся именно виндовые навороты, это его право.

0
28.09.2026, 18:12

Не по теме:

Цитата Сообщение от SarJohnDoe Посмотреть сообщение
мной приводился прямо полный код, решающий эту задачу
а он пишет, что

Цитата Сообщение от Наталья8 Посмотреть сообщение
Вы же ни кто не подскажете...
вот же обманщик))

0
28.09.2026, 18:16

Не по теме:

Цитата Сообщение от Royal_X Посмотреть сообщение
вот же обманщик))
Пробежимся - переименуем папочки. из формата - 1.3.2026 --> в формат - 01.03.2026, 20 пост.

0
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
28.09.2026, 18:21
Цитата Сообщение от zayats80888 Посмотреть сообщение
jcxz, я не собираюсь заниматься демагогией, я просто попросил озвучить контракты, как пользоваться вашей "синхронизацией". Столько текста и ноль полезной информации.
Тогда и не занимайтесь.
А насчёт "полезной инфы": Вся достаточная инфа была в моём примере. А если кто его не понял - я не виноват. Если вы его не поняли - пройдите мимо. Не ваше это значит, займитесь чем-то другим.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Этот порядок может быть очевиден всем, мне, вам, товарищу выше. Он даже может быть физически реален, никто не спорит.
Только в связи с особенностями работы различных компиляторов и "аппаратных железяк", этот очевидный всем порядок бесполезен.
...
...и тря-ля-ля далее... кто бы ещё говорил о демагогии и троллинге.
Цитата Сообщение от Recrut_rf Посмотреть сообщение
почему вы считаете, что приведённый вами, в одном из первых сообщений данной темы, пример кода будет корректно и гарантированно работать. Ограничимся Windows (допустим 10 / 11) и x86 / x64.
Он не будет, он работает. Я не понимаю - что там можно объяснять??? Пример - примитивный. Пишете, что знаете си... что тогда в нём вам не понятно?
Или вы троллите, как товарищ выше?
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
28.09.2026, 18:22
SarJohnDoe, чтобы вставить прямую ссылку на конкретный пост, бери адрес отсюда:

1
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
28.09.2026, 18:27
Наталья8, я чёт всегда думал, что вы не на С++ а на С пишете - вот серьёзно. Понятно, что код из вашего сообщения можно и в плюсы запихнуть и он там прекрасно сработает. Ну мож не прекрасно - но мы его напильником подравняем и он сработает. Но блин - я вот честно хз что это за функции:

_freea(Mask)
*(wcsrchr(new_full_Path, L'\\') + 1) = '\0';
wcscat(new_full_Path, new_name)
Конечно можно понять из контекста / названия / да хоть погуглить. Но когда с подобным не работал - советовать что-то сложно.

Лично мне гораздо проще и привычнее работать с std::string и его производными, с умными указателями и прочими современными вещами. А возвращаться в С++ 98/2003 чёт как то не охота....
На работе это не требуется - за него ещё и по голове настучат. Разве что на собесах....
1
352 / 150 / 10
Регистрация: 19.07.2024
Сообщений: 849
28.09.2026, 18:31
Цитата Сообщение от Igor3D Посмотреть сообщение
Вот пример из справочника где флажок done (тот же stopFlag) объявлен обычной переменной, без всяких атомиков, не говоря уже о volatile. И все работает.
Работает до тех пор, пока компилятор не использует максимальную оптимизацию и пока функции waits() и signal() находятся в одной единице компиляции (файле). Если разнести их в разные единицы, включить макс.оптимизацию и запретить "компиляцию единым файлом", то может перестать работать.
О чём говорил тут уже неоднократно.
Цитата Сообщение от Igor3D Посмотреть сообщение
Эта = та о которой спрашивал по меньшей мере дважды
Говорил то что выше по-крайней мере трижды. Если вынуть голову из эээ.... песка, то можно даже суметь прочитать.
Цитата Сообщение от Igor3D Посмотреть сообщение
Но и не подтверждает.
Какого вам ещё подтверждения надо? На гербовой бумаге с печатью?
Цитата Сообщение от Igor3D Посмотреть сообщение
Зачем же использовать платформо-зависимый код если стандартная библиотека имеет кросс-платформенное решение? Если Вы ним незнакомы - срочно освойте, а то запинают
Ну и SetEvent точно так же не будет работать корректно. Вы нарисовали классическую ошибку синхронизации, ее делают абсолютно все.
Вобщем да - вижу тут собрались одни демагоги и тролли....

На сём ставлю точку. Далее переливайте из пустого в порожнее без меня.
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
28.09.2026, 19:10
Цитата Сообщение от jcxz Посмотреть сообщение
Пишете, что знаете си...
С++ а не Си, на Си никогда вообще не писал. В С++ тоже не гуру программирования, что-то знаю, но до
TheCalligrapher, zayats80888, и прочих экспертов мне как до луны пешком.

И это не издёвка, сарказм, троллинг и прочее - это чистая правда. А опираюсь я вот на это
цитата из cppreference
Note that volatile variables are not suitable for communication between threads; they do not offer atomicity, synchronization, or memory ordering. A read from a volatile variable that is modified by another thread without synchronization or concurrent modification from two unsynchronized threads is undefined behavior due to a data race.
То есть - при использовании volatile для синхронизации получаем неопределённое поведение. А UB означает, что случиться может всё, что угодно - сегодня работает, завтра работает, а через 10 лет даст сбой.
А вы утверждаете что пример корректный.

Вот я и никак не могу понять - в стандарте одно, в реальности другое. Мож в жопу стандарт ? Его тоже люди сочиняют и могут ошибаться.
0
28.09.2026, 19:12

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Вот пример из справочника где флажок done (тот же stopFlag) объявлен обычной переменной, без всяких атомиков, не говоря уже о volatile. И все работает.
Вы там мьютекс что-ли не видите?

0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
28.09.2026, 19:24
Цитата Сообщение от jcxz Посмотреть сообщение
На сём ставлю точку. Далее переливайте из пустого в порожнее без меня.
ээээ нет - подождите!!!!

Я на полном серъёзе - СЕЙЧАС Я ПОСТАВЛЮ ТОЧКУ В СРАЧЕ В ДАННОЙ ТЕМЕ, потому как похоже докопался до истины.....
и это не тролллинг......

Добавлено через 11 минут
в коде происходят две разные вещи:
Автор кода хочет получить:
1. Компилятор действительно каждый раз обращается к state
+
2. Чтение/запись state неделимы и корректно видны другому исполнителю


volatile обеспечивает первую часть.

Вторая часть должна исходить из гарантий конкретной платформы.

Если автор говорит:

«Я предполагаю платформу, где чтение и запись int атомарны»

и его модель выполнения также гарантирует необходимую видимость между ядрами/исполнителями, тогда его алгоритм работает.



А стандартный C++ говорит другое:

Для переносимого C++ нужно выразить вторую часть явно:
std::atomic<int> state{0};

Тогда стандарт гарантирует необходимые свойства атомарного объекта.

Поэтому получается очень точная формулировка:

Алгоритм автора корректен при заявленных им предпосылках о платформе. volatile используется для обеспечения наблюдаемых обращений к state, но не для обеспечения атомарности. Однако запись volatile int сама по себе не является переносимой реализацией межпоточной синхронизации согласно стандарту C++.

И ещё важное уточнение к твоей фразе «по стандарту C++ нет»: это не значит, что стандарт запрещает такой код или что он обязательно неправильно работает. Он просто не даёт тебе необходимых межпоточных гарантий для volatile int.


Именно поэтому автор может совершенно обоснованно сказать «этот алгоритм работает на x86/ARM/bare-metal», а стандартный C++ программист одновременно может сказать «volatile int недостаточно для portable C++ multithreading». Эти утверждения друг другу не противоречат.

Шах и мат господа теоретики и практики!!!

И да - это я нейронку терзал.
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
28.09.2026, 19:25
картинка для пояснения
Миниатюры
Имеет ли смысл создавать volatile переменную  
0
28.09.2026, 20:00

Не по теме:

Цитата Сообщение от jcxz Посмотреть сообщение
Работает до тех пор, пока компилятор не использует максимальную оптимизацию и пока функции waits() и signal() находятся в одной единице компиляции (файле). Если разнести их в разные единицы, включить макс.оптимизацию и запретить "компиляцию единым файлом", то может перестать работать.
О чём говорил тут уже неоднократно.
Забавно. :) До этого, вроде, не просачивалось.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2026, 20:00

const volatile
Пример из Шилдт Г. &quot;С++ Базовый курс (3-е издание, 2010)&quot; стр 205 const volatile unsigned char...

исследование volatile
Здравствуйте. В университете дали задание: &quot;Исследование квалификаторов volatile и инструкции...

int\ volatile int \ const int
Товарищи, паника! Имеется код: int a = 5; std::cout &lt;&lt; &quot;Init value a: &quot; &lt;&lt; a &lt;&lt; &quot;\n&quot;; ...

const_cast: const и volatile
Как известно const_cast сбрасывает наложенные ограничения при помощи модификаторов const и...

Что такое "volatile int"
есть объявление и инициализация переменной: volatile int Sklad = 0; что такое &quot;volatile&quot;? с msdn...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru