Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700

Гарантирует ли стандарт атомарное чтение и запись данных, размер которого не более чем машинное слово?

02.03.2018, 22:16. Показов 3582. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Насколько я знаю атомарность для чтения и записи данных которые не более чем одно машинное слово, гарантируется на уровне процессора. А со стороны стандарта с++ есть подобные гарантии? Тут речь не про std::atomic, а именно про обычные переменные.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.03.2018, 22:16
Ответы с готовыми решениями:

Найти минимальный элемент, двоичная запись которого заканчивается не более чем двумя нулями
25 задача ЕГЭ Здравствуйте. Дан массив, содержащий 2020 положительных целых чисел, не превышающих 15 000. Необходимо найти...

Вывести слово минимальное по величине столько раз, сколько букв в первом слове, если это слово более чем из
Вывести слово минимальное по величине столько раз, сколько букв в первом слове, если это слово более чем из трех букв. В противном случае...

Из 8 машинных слов сформировать новое машинное слово. Подсчитать количество идентичных слов в сегменте данных.
Разработать программу, выполняющую действия в соответствии с вариантом задания. Все задания должны быть выполнены на основе принципа...

61
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
08.03.2018, 02:29
Студворк — интернет-сервис помощи студентам
TRam_, в контексте вопроса ТС, тут скорее проблема не в "устаревших значениях", а в том, что можно получить значение, которое только частично "обновилось", если операции чтения/записи не атомарны.

Добавлено через 22 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
Или значение (содержимое полей структуры), которое было обновлено только частично.
Именно "частичное обновление" и значит, что операция чтения или записи не атомарна.

ТС же интересует, есть ли определённые гарантии атомарности стандартных типов в стандарте языка.
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
08.03.2018, 02:43
gray_fox, если работать на однопроцессорной машине/в одном потоке и никакие прерывания/другие потоки не меняют переменные этой программы, то ситуации что "частично обновилось" не бывает. Просто потому, что код будет выполняться строго последовательно, а "частичное обновление" подразумевает то, что в выполнение программы как-то вклинились между какими-то из последовательных операций обновления переменной.

Добавлено через 9 минут
По тому же принципу мьютексы/семафоры в однопоточной программе бессмысленны - потому что могут привести только к зависанию из-за самоблокировки потока, или просто будут бесполезно жрать ресурсы, закрываясь и открываясь.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
08.03.2018, 02:45
Цитата Сообщение от TRam_ Посмотреть сообщение
сли работать на однопроцессорной машине и никакие прерывания не меняют переменные этой программы, то ситуации что "частично обновилось" не бывает.
Вы имеете ввиду, что все store/load (и "производные") операции атомарны в контексте одного процессора? Я правильно понял?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
08.03.2018, 02:48
Цитата Сообщение от gray_fox Посмотреть сообщение
Я правильно понял?
в контексте одного процессора с выключенными прерываниями. Но такого в реальности почти не бывает, можно говорить только о абсолютной атомарности для "одного процессора, прерывания которого не оказывают влияния на переменные данной программы"
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
08.03.2018, 03:02
Потому что это очевидно не так.

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

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

Не по теме:

Цитата Сообщение от TRam_ Посмотреть сообщение
в контексте одного процессора с выключенными прерываниями.
Тут уже от архитектуры конечно зависит, но, к.м.к., если операция атомарна (или нет), то она атомарна вне зависимости от того, мультипроцессорная ли платформа или нет.

0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
08.03.2018, 03:16
Цитата Сообщение от gray_fox Посмотреть сообщение
которая не имеет никакого отношения к изначальному вопросу
Как не имеет? Уже ж было сказано, что на многопроцессорной машине без гарантированной синхронизации кэшей операция для переменной длиной в машинное слово не будет атомарной, потому что другой поток на другом ядре может получить устаревшее значение переменной уже после выполнения присвоения этой переменной нового значения. Несмотря на то, что этому ядру требуется только один такт для такого присвоения, а тому ядру - один такт для считывания.
Случай, если у нас однопоточная программа, разобран выше.
Остаётся случай, когда у нас многопоточная программа и процессор одноядерный или с синхронизацией кэшей, то для него могло быть что-то записано в стандарте (так как да, атомарность операций с машинным словом тут была бы логична). Но он же частный.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
08.03.2018, 04:33
Цитата Сообщение от TRam_ Посмотреть сообщение
на многопроцессорной машине без гарантированной синхронизации кэшей операция для переменной длиной в машинное слово не будет атомарной
Ты путаешь такие понятия, как атомарность и видимость (atomicity and visibility).

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

Видимость значит, как другие (относительно текущего) потоки могут видеть состояние переменной: тут уже зависит от memory_order
- если, например, использовть release-acquire семантику, то поток, "читающий" значение, получит актуальное значение сразу же при чтении (будет синхронизация кеша(/кешей), если "физические" ядра различны)
- если использвать relaxed семантику, то изменения значения не будут сразу же "распространены" (ничто не синхронизируется, просто изменяется значение переменной). Но, тем не менее, операции атомарны

Добавлено через 14 минут
В последнем абзаце я подразумеваю, что переменная - инстанс std::atomic<>.
1
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
08.03.2018, 11:45
Лучший ответ Сообщение было отмечено Undisputed как решение

Решение

Умные дяди пишут что стандарт ничего не гарантирует (перевод статьи)

В C/C++ каждая операция считается неатомарной до тех пор, пока другое не будет явно указано прозводителем компилятора или аппаратной платформы — даже обычное 32-битное присваивание.
C++
1
2
3
4
5
uint32_t foo = 0;
void storeFoo()
{
    foo = 0x80286;
}
Стандарты языка ничего не говорят по поводу атомарности в этом случае. Возможно, целочисленное присваивание атомарно, может быть нет. Поскольку неатомарные операции не дают никаких гарантий, обычное целочисленное присваивание в C является неатомарным по определению.
1
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
08.03.2018, 12:11
Цитата Сообщение от gray_fox Посмотреть сообщение
- если, например, использовть release-acquire семантику, то поток, "читающий" значение, получит актуальное значение сразу же при чтении
Что здесь поднимается под "актуальным значением"?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.03.2018, 13:41  [ТС]
Ygg,
Спасибо за статью!

Добавлено через 8 минут
Попробую ответить пока gray_fox нет
Может добавит что-то

Цитата Сообщение от SeqInconsistent Посмотреть сообщение
Что здесь поднимается под "актуальным значением"?
Процессор оперирует данными как правило через свои кэши
При этом у каждого ядра свой кэш
Учитывая то что каждый поток выполняется на отдельном ядре (физическом или логическом)
То если поток А что-то записал себе в кэш, это вовсе не значит что поток Б тут же увидит это значение
Поток Б будет работать со своим кэшем и у него вполне может быть другое значение для этой же переменной
Но ядра могут обмениваться своми кэшами

Под актуальностью подразумевается то, что при чтении данных используя барьеры памяти поток Б может забрать к себе в кэш то что записал поток А... (подразумевается что поток А был последним который что либо записал в эту переменную). И чтение этих данных потоком Б будет строго после того как завершится синхронизация кэшей.

Насчет логических ядер - синхронизация скорее всего не понадобится т.к у них вроде как должен быть общий кэш для данных.... Но не уверен...
0
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
08.03.2018, 13:47
Цитата Сообщение от Undisputed Посмотреть сообщение
Процессор оперирует данными как правило через свои кэши
Меня интересует что понималось под "актуальным значением" с формальной точки зрения (стандарта).
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.03.2018, 13:54  [ТС]
Цитата Сообщение от SeqInconsistent Посмотреть сообщение
Меня интересует что понималось под "актуальным значением" с формальной точки зрения (стандарта).
Понятно. Насколько я знаю в стандарте такого понятия нету.
Там все это объясняется понятиями "происходит раньше", "синхронизируется-с" и т.п
0
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
08.03.2018, 16:08
Цитата Сообщение от Undisputed Посмотреть сообщение
Насколько я знаю в стандарте такого понятия нету.
Смотря что понимать под "актуальным значением".
Если последнее значение из modification order (http://eel.is/c++draft/intro.r... tion_order) — то есть.
Но в таком случае утвержедние про то, что load-acquire получает "актуальное значение" — неверно, т.к. стандарт такого не гарантирует.

Поэтому непонятно, что подразумевалось под "актуальным значением" в
Цитата Сообщение от gray_fox Посмотреть сообщение
если, например, использовть release-acquire семантику, то поток, "читающий" значение, получит актуальное значение сразу же при чтении
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
08.03.2018, 22:58  [ТС]
SeqInconsistent,
Не очень понятно что именно вы хотите сказать, расшифруйте плиз
Ну есть порядок изменений, ясное дело, есть... Но не понятно что дальше вы имеете ввиду...

Тут речь о том что если поток А сделал store используя memory_order_release, то при load этой же самой атомарной переменной с memory_order_acquire поток Б увидит то, что последним было записано в эту самую атомарную переменную потоком А.

Добавлено через 19 минут
Может я поступил не правильно ответив за вашего собеседника, но мне лично логика того сообщения недвусмысленно видится именно такой .
0
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
09.03.2018, 00:23
Цитата Сообщение от Undisputed Посмотреть сообщение
Тут речь о том что если поток А сделал store используя memory_order_release, то при load этой же самой атомарной переменной с memory_order_acquire поток Б увидит то, что последним было записано в эту самую атомарную переменную потоком А.
Такой гарантии нет.

Добавлено через 2 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
Не очень понятно что именно вы хотите сказать, расшифруйте плиз
Я хочу сказать, что "последнее значение из modification order" это единственное, что приходит мне на ум, когда я читаю про "актуальное значение".

Но, как я уже говорил, никто чтению с memory_order_acquire не гарантирует получения этого последнего значения.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.03.2018, 09:23  [ТС]
Цитата Сообщение от SeqInconsistent Посмотреть сообщение
никто чтению с memory_order_acquire не гарантирует получения этого последнего значения.
Операция загрузки с этим упорядочением памяти выполняет операцию захвата (acquire) над задействованной областью памяти: предыдущие записи, сделанные в зависимую от данных область памяти потоком, который выполнил освобождение (release), становятся видимыми в данном потоке.
http://ru.cppreference.com/w/c... mory_order

Так же по вашей ссылке:
Certain library calls synchronize with other library calls performed by another thread. For example, an atomic store-release synchronizes with a load-acquire that takes its value from the store
Приблизительный перевод выделенного:
Атомарная операция store с освобождением (memory_order_release), синхронизируется с загрузкой acquire (memory_order_acquire), которая получает значение, сохраненное при помощи store операции.

То есть acquire-читатель видит то, что сохранил release-писатель для той же самой атомарной переменной.

Исходя из написанного, поведение, о котором идет речь, именно что гарантируется...
Отсюда возникает вопрос - что по вашему не так?
0
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
09.03.2018, 12:21
Цитата Сообщение от Undisputed Посмотреть сообщение
То есть acquire-читатель видит то, что сохранил release-писатель для той же самой атомарной переменной.
Там всего лишь указано, какие store-release синхронизируются с какими load-acquire: с теми, которые прочитали значение, записанное данным store-release.
В обратную сторону это тоже работает: с теми, которые не прочитали значение — не синхронизируются.

Цитата Сообщение от Undisputed Посмотреть сообщение
Исходя из написанного, поведение, о котором идет речь, именно что гарантируется...
Исходя из написанного именно что не гарантируется. Т.к. load-acquire самого по себе недостаточно для синхронизации, а нужен такой load-aсquire, который прочитал значение. Там же не написано что "load-acquire synchronizes with the last store-release".

Цитата Сообщение от Undisputed Посмотреть сообщение
Отсюда возникает вопрос - что по вашему не так?
Для операций, которые читают последнее значение из modification order — это явно указано.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.03.2018, 13:16  [ТС]
Цитата Сообщение от SeqInconsistent Посмотреть сообщение
а нужен такой load-aсquire, который прочитал значение.
Ну да, об этом и речь... load-acquire читает значение, что же еще кроме этого делать load-acquire?

Ладно...
Может мы просто не понимаем друг друга
0
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
09.03.2018, 14:38
Цитата Сообщение от Undisputed Посмотреть сообщение
Ну да, об этом и речь... load-acquire читает значение, что же еще кроме этого делать load-acquire?
Ещё раз:
Цитата Сообщение от http://eel.is/c++draft/atomics#order-2
An atomic operation A that performs a release operation on an atomic object M synchronizes with an atomic operation B that performs an acquire operation on M and takes its value from any side effect in the release sequence headed by A.
Release операция синхронизируется с той acquire операцией, которая читает значение, записанное данной release операцией (для простоты я игнорирую часть про release sequence).
"and takes its value" — это именно условие синхронизации, что значение должно быть прочитано, чтобы произошла синхронизация.
Ты же понимаешь это как "acquire синхронизируется с release и читает значение". То, что read читает, это, как бы, очевидно. Ты правда считаешь, что стандарт фразой "and takes its value" просто хочет сказать, что чтения читают?

На примере: в modification order для M присутствуют записи значений "a, b, c, d", записанные операциями release_a, release_b, release_c, release_d. Если acquire читает значение a, то release_a сихнронизируется с этим acquire. Если читает b — то release_b и т.д.
Правило говорит только про то, что acquire синхронизируется с тем release, чьё значение читает, не более того.

В общем случае гарантий, что acquire прочитает последнее значение из modification order — нет.

Гарантии есть, например, для memory_*order​::​seq_*cst:
Цитата Сообщение от http://eel.is/c++draft/atomics#order-3
There shall be a single total order S on all memory_*order​::​seq_*cst operations, consistent with the “happens before” order and modification orders for all affected locations, such that each memory_*order​::​seq_*cst operation B that loads a value from an atomic object M observes one of the following values:
the result of the last modification A of M that precedes B in S
Если теперь обратиться к части про release sequence:
Цитата Сообщение от http://eel.is/c++draft/intro.multithread#def:release_sequence
A release sequence headed by a release operation A on an atomic object M is a maximal contiguous sub-sequence of side effects in the modification order of M, where the first operation is A, and every subsequent operation
— is performed by the same thread that performed A, or
— is an atomic read-modify-write operation.
Т.е. release sequence это максимальная непрерывная последовательность операций над atomic object M, сформированная определённым образом.
Вернёмся к синхронизации через чтение значения
and takes its value from any side effect in the release sequence headed by A.
Это говорит, что для синхронизации с release operation A надо прочитать либо само значение, записанное операцией, либо любое из последующих в release sequence.

Зачем написано про любое значение из release sequence, если у нас якобы есть гарантия, что load-acquire (с memory_order ≠ seq_cst) гарантированно читает последнее значение из modification order?
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
09.03.2018, 16:05
Цитата Сообщение от gray_fox Посмотреть сообщение
Ты путаешь такие понятия, как атомарность и видимость (atomicity and visibility)
Мне вот тоже кажется, что разные участники обсуждения понимают разные вещи под словом "атомарность". Скорее всего причина в том, что стандартные интерфейсы atomic внутри себя содержат сразу две вещи:
1. Непосредственная атомарность операции - т.е. гарантия того, что, например, при чтении из памяти, мы получим либо старое, либо новое значение (и никаких комбинаций, когда один байт старый, а другой новый)
2. Семантика операции (release, acquire, relaxed и т.п.) - не знаю, как этот параметр по умному называется. Т.е. учёт аппаратных особенностей исполнения операций чтения-записи

Кто-то под атомарностью подразумевает только п.1. (т.е. истинную смысловую нагрузку слова "атомарный"), а кто-то - одновременно п.1 и п.2. (т.е. смысл, который вкладывается в стандарты интерфейсов "atomic")

Добавлено через 5 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Насколько я знаю атомарность для чтения и записи данных которые не более чем одно машинное слово, гарантируется на уровне процессора
Чисто на всякий случай. "Слово" - это довольно размытое понятие, которое зачастую зависит от контекста. Но даже если предположить под "словом" то, что ты имел в виду, то даже и в этом случае ты не полностью прав. В случаях, когда аппаратура позволяет строить обращения по невыровненному адресу (как это имеет место быть на intel'овской системе команд), обычно такие невыровненные обращения НЕ являются атомарными из-за особенностей работы контроллеров памяти. Контроллер памяти обычно работает только по выровненным адресам, а потому обращения по невыровненному адресу обычно отрабатываются в два приёма, а потому не являются атомарными

Цитата Сообщение от Undisputed Посмотреть сообщение
А со стороны стандарта с++ есть подобные гарантии?
Просто чисто логически размышляя, стандарт такого не гарантирует, в противном случае не нужно было бы в стандарты вводить std::atomic и прочее
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2018, 16:05

Как увеличить размер загружаемого файла более чем 100М ?
До 5 гигов?!

Определить существует ли кандидат, за которого проголосовало более чем половина избирателей
Сэм i Юра участвуют в выборах. Но это им показалось слишком скучным, i они опросили всех избирателей, за кого они голосовали. Известно, что...

Тип данных запись: Найти багаж, средний вес одной вещи в котором отличается не более, чем на 0,3 кг от общего среднего веса одной вещи
Найти багаж, средний вес одной вещи в котором отличается не более, чем на 0,3 кг от общего среднего веса одной вещи. Программу надо...

Чтение чисел из двух и более файлов и запись в векторы
В общем моя задача такова: Есть 2 и более файла, каждый из которых наполнен столбцом чисел. Мне нужно прочесть числа из каждого файла и...

Вывод более чем 1 запись по значению
Добрый день. Имеется таблица T1(id,name,primmark,tran),T2(id,crd,date) Как вывести данные из таблицы у которых в таблице T1 по полю...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru