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

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

16.09.2026, 11:08. Показов 14306. Ответов 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
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13234 / 6866 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
28.09.2026, 20:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Recrut_rf Посмотреть сообщение
картинка для пояснения
Нет. Просто "ordering" - это ничего не значащий термин. Полное отсутствие ordering - это тоже один из видов ordering в С и С++. А именно: memory_order_relaxed - это атомарность самой модификации, но никаких гарантий ordering.

Ещё раз: для того, чтобы синхронизация на основе тупой записи/проверки volatile переменных работала, нужен не просто "ordering", а total ordering, то есть все операции записи-чтения должны выполняться с memory_order_seq_cst. Ни одна платформа вам такого "из коробки" не гарантирует.

"Из коробки" на некоторых платформах вы получаете только acquire/release семантику. Это хороший и весьма сильный ordering. На его основе можно построить корректные синхронизационных примитивы. Но это будет совсем не тупое "записал/проверил переменную".
1
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
28.09.2026, 21:11
TheCalligrapher, спасибо, понял.

В общем - если подытожить. Что, в общем то вы уже давным давно сделали

имеем два подхода в программировании:
1 - условно железячный.
Много лет изучаем кунгфу чтобы перейти реку прямо по воде, а не потонуть на полпути
Досконально изучаем архитектуру платформ и все её тонкости и используем эти знания в программировании. Принимая на веру, что оно работает именно так и что во всём досконально разобрались. Язык здесь чисто как средство перенести систему команд процессора на более высокий уровень. А стандарт вторичен. Поэтому на его гарантии плевать, главное в коде "отобразить" систему команд.

2 - стандартный
платим паромщику и через пять минут мы на другом берегу, оставшиеся много лет живём в своё удовольствие
Пишем код согласно стандарту, не принимая в расчёт систему команд и прочие низкоуровневые вещи. Сам язык даёт гарантии своего поведения. Ответственность за правильную реализацию и корректность поведения, согласно стандарту, перекладывается на разработчиков компиляторов.

Какому пути следовать - пусть каждый решает сам.

но чёт мне кажется, что большинство выберут второй путь. Особенно в коммерческой разработке. В своих же проектах каждый волен извращаться как хочет.
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
28.09.2026, 22:53
Цитата Сообщение от SarJohnDoe Посмотреть сообщение
В другой теме (именно по этому вопросу) мной приводился прямо полный код
А я прокомментирую. Это писал искусственный интеллект.
И ответственности ни кто не несёт. И в закорючках redex, я ни чего не понимаю.
Это называется гавном бросаться.
Надеюсь это вам не составило труда.
Вообще искуственный интеллект в логике не силён и лажает сильно...
========
WinApi для винды, волшебная вещь.
И оно не пишеться новое, не меняеться (deprecated), каждый год.
Насколько волшебное?
Извиняюсь... То что мы здесь делаем называеться публиковать.
Я совсем не уверен, что надо всё публиковать.
Не ломаю программы. Пишу обёртки.

Добавлено через 25 минут
Royal_X,
Ты тоже тролль ещё тот... Мне такую хрень все пишут всё время.
И ни чего конструктивного.
И я тоже тролль. Потому что ни хрена мне не надо.
Так, делать не чего...
0
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
28.09.2026, 23:19
Recrut_rf,
Мне не хочеться вас обижать,

А что это за функция?
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
29.09.2026, 00:08
Цитата Сообщение от Наталья8 Посмотреть сообщение
Мне не хочеться вас обижать
да я не из обидчивых

описание функций можно вот тут смотреть cppreference.com

тут и С и С++ и лишней "воды нет", а ещё есть примеры.

ну и да - я хреново знаю сишную часть стандартной либы С++. Очень редко приходится пользоваться.
Цитата Сообщение от Наталья8 Посмотреть сообщение
WinApi для винды, волшебная вещь.
Ежели цель - написать исключительно под винду - то это отличный вариант. Особенно, если вы понимаете, что делаете.
Код будет максимально эффективным и производительным. Лично я сходу не смогу - надо почитать описания, какую функцию лучше вызвать и почему. Там ведь могут быть варианты...
0
Заблокирован
Эксперт функциональных языков программированияЭксперт С++
29.09.2026, 00:45
Цитата Сообщение от Recrut_rf Посмотреть сообщение
Лично я сходу не смогу - надо почитать описания, какую функцию лучше вызвать и почему.
Так с ходу никто и не пишет (уж Наталья8 точно), все равно все так или иначе смотрят документацию. Наведение курсора в IDE не поможет понять смысл всех параметров функции.
Допустим, для самой банальной функции имеем:
C++
1
2
3
4
5
6
7
8
9
HANDLE CreateFileW(
  [in]           LPCWSTR               lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);
Очевидно, что даже тут без документации не понять, как правильно ввести аргументы. В документации есть здоровенная страница про эту функцию.
Ну разве что можно обойтись без документации, когда одну и ту же функцию или кусок кода ты используешь часто и знаешь уже наизусть или просто есть готовый кусок. В таких случаях, конечно, работа идет быстрее. Например, у меня уже есть целая коллекция разнообразных кусков кода для всяких задач на WinAPI и я их просто переиспользую.

Смотреть в документацию не стыдно и это вовсе не признак тупости. Наоборот, умный программист потратит 5 мин и не поленится посмотреть в доку, тогда как тупой программист напишет что-то по памяти и потом будет 2 часа сношаться с ошибками.

Цитата Сообщение от Recrut_rf Посмотреть сообщение
тут и С и С++ и лишней "воды нет", а ещё есть примеры
мне кажется, Наталья8 знает про сайт https://en.cppreference.com. Это просто такой популярный ресурс, что любой программист С++/С (даже хоббист) должен знать про него. Есть еще альтернативный сайт https://cplusplus.com/reference/.
0
 Аватар для Наталья8
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
 Аватар для Наталья8
638 / 396 / 68
Регистрация: 09.03.2016
Сообщений: 4,373
29.09.2026, 04:36
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
29.09.2026, 22:06
Цитата Сообщение от SarJohnDoe Посмотреть сообщение
и второй - это уже не про собственно переменную, а синхронизацию операций (например, работают три потока, и они должны гарантированно выводить A, B и C, и только в таком порядке).
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Без гарантий упорядочения памяти разные потоки могу "видеть" разные относительные порядки изменения значений в этих трех переменных. То, что один поток честно придерживался договоренности выставлять переменные в порядке A -> B -> C, совсем не гарантирует, что читающий поток "увидит" изменения этих переменных в том же порядке. Вышеупомянутая договоренность без гарантий упорядочения памяти просто не работает.
Я помню в книжке подобное "увидеть в том же порядке", но не понял и не стал прилагать усилия. Ни о каких трех потоках и A, B, C я не спрашивал. Что это за "увидеть"? Поток записал 1 в переменную что была 0. Другой поток прочитал. Если 1 - значит "увидел", иначе "не увидел". Других разумных вариантов я не вижу. А если так, то нужно ответить на мой вопрос типа "да, без синхронизации другой поток может прочитать старое значение хотя запись первым потоком состоялась". А не вилять с увидел/не увидел. "В том же порядке" из той же оперы. Понятно что любое чтение (включая атомарное) соответствует значению на какой-то момент времени который уже прошел (и значение в принципе может быть изменено). Поэтому речь может идти только о последнем значении до синхронизации. И наконец, все это актуально только для данных неатомарных или со слабой атомарностью. В общем, что там за "увидеть в том же порядке" - мутность великая
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
29.09.2026, 22:33
Цитата Сообщение от Igor3D Посмотреть сообщение
Поток записал 1 в переменную что была 0. Другой поток прочитал. Если 1 - значит "увидел", иначе "не увидел". Других разумных вариантов я не вижу. А если так, то нужно ответить на мой вопрос типа "да, без синхронизации другой поток может прочитать старое значение хотя запись первым потоком состоялась".
Igor3D, если вы все еще про свой "флаг для остановки потока", то вам для этого не нужна синхронизация, вам нужна гарантия атомарности изменения и того, что это изменение будет увидено когда нибудь. Все. Для этого достаточно std::atomic + std::memory_order_relaxed.
Для большинства остальных практических задач конкурентного программирования нужна сихронизация, т.к. там важен порядок.
0
 Аватар для Recrut_rf
392 / 337 / 66
Регистрация: 14.10.2014
Сообщений: 1,538
30.09.2026, 07:41
Наталья8, пасиб за ликбез
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13234 / 6866 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
30.09.2026, 08:18
Цитата Сообщение от zayats80888 Посмотреть сообщение
то вам для этого не нужна синхронизация, вам нужна гарантия атомарности изменения и того, что это изменение будет увидено когда нибудь. Все. Для этого достаточно std::atomic + std::memory_order_relaxed.
Тем не менее решение выставить "флаг остановки потока" все равно может основываться на каких-то предусловиях, которые поток, выставляющий этот флаг, считает выполняющимися. То есть, поток, который дает команду об остановке, может содержать что-то вроде

C
1
2
global_variable = 42;
stop_flag = 1;
(где 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
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
30.09.2026, 13:07
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Однако вполне может оказаться, что этот завершающийся поток напоследок еще собирается сделать какие-то прощальные телодвижения в расчете на то, что global_variable равно 42.
Тогда это будет уже не "стоп флаг" (аля сигнал о получении сообщения и сообщение в одном флаконе), а совсем другая задача (флаг - только сигнал, сообщение отдельно). Разумеется, в этом случае нужна синхронизация.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Чтобы решить эту проблему в случае volatile stop_flag вам придется сделать global_variable тоже volatile.
Только и этого недостаточно (при этом еще и "криво", как вы верно заметили). Это никак не защитит от аппаратного переупорядочивания, на определенных архитектурах тут нужна специальная инструкция, предоставляющая memory barrier.
Я понимаю, что вы говорите только об оптимизация компилятора, но в контексте синхронизации они не существуют отдельно от оптимизаций аппаратных и должны решаться комплексно.

Но в целом ваш посыл понятен: если плохо представляете, что делаете, используйте "дефолтную" семантику.

Добавлено через 1 час 30 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
_Atomic переменные решают эту задачу по-другому
Мне интересно, почему вы тут упоминаете именно _Atomic, неужели С-компилятор будет вести себя иначе, чем С++-компилятор c std::atomic в этом отношении (при прочих "равных", разумеется)?
0
1519 / 534 / 78
Регистрация: 22.09.2023
Сообщений: 1,701
30.09.2026, 15:51
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
вам придется сделать global_variable тоже volatile. А это криво и косо, ибо тотально подавит все оптимизации для этой переменной. _Atomic переменные решают эту задачу по-другому: вводят понятие барьера, при пересечении которого все переменные, доступные другим потокам, могут "необъяснимо поменяться". Пока такой барьер не пересекается, работу с переменной можно оптимизировать обычным образом.
То есть подавление оптимизаций для одной переменной, которую вменяемый программист присваивает только и именно там, где это нужно (а все промежуточные вычисления выполняет в обычной переменной, чтобы дать порезвиться оптимизатору) - это "криво и косо", а поставить барьер, который обязывает зафиксировать вообще все переменные, даже те, которые никакого отношения к этому барьеру не имеют - это правильно и во всех смыслах хорошо? Какая-то извращенная логика...
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
30.09.2026, 17:35
Цитата Сообщение от Dushevny Посмотреть сообщение
Какая-то извращенная логика...
В вашей претензии конечно есть логика, но я хочу сказать, что те самые оптимизации, которые вы вынесли в промежуточные вычисления, никак не будут затронуты, они в любом случае не могут "перепрыгнуть" факт записи их результатов (это не относится к программистам, которые не используют локальные объекты, а объявляют все переменные в глобальной области, им воообще никакие оптимизации не помогут). На а те же, что будут затронуты, возможно не так и критичны? Там, где вам кажется, что у вас есть выбор между двумя volatile и одной std::atomic с подходящей семантикой, я уверен, в большинстве случаев, выбор последней ничего не изменит, но при этом код будет корректный и для тех случаев, где такого выбора в принципе не стоит.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
30.09.2026, 18:22
Цитата Сообщение от zayats80888 Посмотреть сообщение
Тогда это будет уже не "стоп флаг" (аля сигнал о получении сообщения и сообщение в одном флаконе), а совсем другая задача (флаг - только сигнал, сообщение отдельно). Разумеется, в этом случае нужна синхронизация.
Такая ситуация по меньшей мере возможна, напр
C++
1
2
3
4
5
6
7
// пишущий поток
errorCode = err_Cancel;
flagStop = 1;
 
// читающий поток
if (flagStop) {
 code = errorCode;
Возможно что в результате оптимизаций компилятора и/или процессора прочитается flagStop = 1, но errorCode еще не будет записан (когда-то подобная проблема была с оператором new). Это ведет к ошибке. Вернемся к моему вопросу
Не гарантируется что данные записанные одним потоком будут корректно прочитаны другим
Можно поупираться, мол, да записи-то еще не было. Но лично я считаю этого достаточно, ответ: не гарантируется
Хорошо, а какие еще есть варианты неверного чтения кроме "писатель не успел все записать"?
Напр возможна ли ситуация когда установленный (неатомарный) stopFlag не прочтется никогда?

Да, ну и какие мнения насчет использования все-таки НЕ атомарного stopFlag? Есть ли в этом какой-то смысл, его обычно проверяют часто. Хотя синхронизация настолько легка/приятна что копаться дальше не хочется
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
30.09.2026, 18:58
Цитата Сообщение от Igor3D Посмотреть сообщение
Такая ситуация по меньшей мере возможна, напр
Конечно, возможно все (хотя, на практике, обычно завершающийся поток сообщает об успешности или ошибках, а не наоборот).
Для описанного вами примера, достаточно писать в flagStop с семантикой memory_order_release, а читать с семантикой memory_order_acquire. Но зная ваше пристрастие к всяким теоретизированиям, там может появится третий поток и дополнительные состояния. В итоге, наш стоп флаг затеряется в монструозной lock-free структуре с hazard pointers и т.д. и т.п. Так что специально для вас, рекомендую использовать семантику по умолчанию.
Цитата Сообщение от Igor3D Посмотреть сообщение
Да, ну и какие мнения насчет использования все-таки НЕ атомарного stopFlag?
Мнение только одно - UB.

Не по теме:

А всем любитетлям срывать покровы с запретов я могу лишь пожелать никогда не встретить на своем пути табличку с надписью "Не есть желтый снег!".

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13234 / 6866 / 1827
Регистрация: 18.10.2014
Сообщений: 17,400
01.10.2026, 09:30
Цитата Сообщение от Dushevny Посмотреть сообщение
которую вменяемый программист присваивает только и именно там, где это нужно (а все промежуточные вычисления выполняет в обычной переменной, чтобы дать порезвиться оптимизатору)
Никто не утверждает, что "барьерное" поведение является идеальным. Я уже демонстрировал соответствующие оптимизационные проблемы в #44.

Если на минутку отвлечься от темы конкурентного упорядочения памяти, а рассматривать только компиляторные "деоптимизации", то различия между этими двумя вариантами сводятся к разнице в том, "что" и "когда" деоптимизируется:

volatile:
Что: деоптимизируются только volatile переменные
Когда: всегда - при любом доступе к такой пременной

_Atomic:
Что: все переменные, картина aliasing которых не ясна компилятору (т.е. для которых компилятор не может доказать, что они не поменяются конкурентно)
Когда: только при пересечении сответствующего барьера

Какой способ тут лучше? У каждого варианта есть свои преимущества и недостатки. (Опять же - закрывая глаза на другие критически важные свойства _Atomic, которых volatile просто не имеет. Как только мы открываем на них глаза, тогда - _Atomic без вариантов). Бороться с нежелательными деоптимизациями придется и там, и там. И способы борьбы одинаковые - забирать вычисления в отдельную переменную: не глобальную, не volatile, и алиасинг которой ясен компилятору, см. опять же #44.

Вы говорите, что сброс в память "всех" переменных - это якобы проблема. Не думаю. На самом деле этих несброшенных переменных в каждый момент - одна-две. И это при том, что сбрасывать переменные в память компилятор и так будет много и часто безо всяких барьеров. Достаточно просто вызвать функцию из другой ТС, определение которой компилятору не видно и семантика которой не ясна.

Добавлено через 3 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
Мне интересно, почему вы тут упоминаете именно _Atomic, неужели С-компилятор будет вести себя иначе, чем С++-компилятор c std::atomic в этом отношении (при прочих "равных", разумеется)?
Мне просто хочется смотреть исключительно на голое поведение ядра языка, без малейшей примеси библиотечной функциональности. До сих пор речь во многом шла в первую очередь именно о встроенных, а не перегруженных операторах. По этой же причине я предпочитаю экспериментировать сначала с C, а не С++. А уже при возникновении подозрений на различия сравнивать с С++.

Да, мы уже рассматривали код, генерируемый для std::atomic, и видели, что там ничего лишнего не появляется. Но все равно для пущей чистоты экперимента с именно встроенными операторами я прицепился именно к _Atomic.
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,222
Записей в блоге: 2
01.10.2026, 14:04
Цитата Сообщение от zayats80888 Посмотреть сообщение
Конечно, возможно все (хотя, на практике, обычно завершающийся поток сообщает об успешности или ошибках, а не наоборот).
Для описанного вами примера, достаточно писать в flagStop с семантикой memory_order_release, а читать с семантикой memory_order_acquire. Но зная ваше пристрастие к всяким теоретизированиям, там может появится третий поток и дополнительные состояния. В итоге, наш стоп флаг затеряется в монструозной lock-free структуре с hazard pointers и т.д. и т.п. Так что специально для вас, рекомендую использовать семантику по умолчанию.
А по-моему нет ничего плохого в теоретизировании (и в теории вообще) если оно в меру и к месту. Правда сам я теоретизировать не умею, никакой монструозной структуры не замышлял, задаю простые "житейские" вопросы
Цитата Сообщение от Igor3D Посмотреть сообщение
Хорошо, а какие еще есть варианты неверного чтения кроме "писатель не успел все записать"?
Напр возможна ли ситуация когда установленный (неатомарный) stopFlag не прочтется никогда?
Или
Почему если я, как честный пионер, пишу/читаю строго под мутексом, то никаких атомиков и синхронизаций не требуется?
И вот еще любопытный момент
Каким образом запрещается оптимизация/перестановка команд процессором? Напр первая команда пишет в ячейку памяти 1, вторая - в ячейку 2, казалось бы, ячейка 1 должна быть записана раньше. Так и есть, напр на 100 итерациях. Но вот на 101-й процессор почему-то(?) сделал наоборот, ячейка 2 записалась раньше. А другой поток это прочитал/подхватил что повело к ошибке. Ну и как с этим борются? Или я все неверно понимаю?

Не по теме:

Цитата Сообщение от zayats80888 Посмотреть сообщение
А всем любитетлям срывать покровы с запретов я могу лишь пожелать никогда не встретить на своем пути табличку с надписью "Не есть желтый снег!".
А клозетные шутки грамотному человеку не к лицу :)

0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
01.10.2026, 16:30
Igor3D, я понимаю, что вы активно кодили еще во времена до С++11, когда многопоточность еще не была стандартизтрована и каждый выкручивался как мог.
Но с тех пор прошло много времени, компиляторы сильно изменились, железки стали в сотни раз сложнее и быстрее (на вашем смартфоне все те фокусы уже не прокатят).
А стандартный С++ позволяет вам писать априори корректный конкурентный код, а не эмпирически. Причем все те "приемчики", которыми вы жаждите поделиться, легко переписываются на стандартный с++ без какого-либо ущерба.
Ну нет никакого смысла копаться в сортах UB. (Разве что ради поддержки legacy, хотя, сейчас можно попросить ИИ все переписать).

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
А клозетные шутки грамотному человеку не к лицу :)
Меня не то чтобы беспокоит ущерб моей виртуальной репутации анонима среди таких же анонимов. Не вижу я способа её "обналичить", а потому насрать.



Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Почему если я, как честный пионер, пишу/читаю строго под мутексом, то никаких атомиков и синхронизаций не требуется?
Ну, наверное потому, что мьютекс предоставляет синхронизацию?



Добавлено через 26 минут

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Каким образом запрещается оптимизация/перестановка команд процессором?
Можете загуглить, например, "arm memory ordering instructions".

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
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