|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Гарантирует ли стандарт атомарное чтение и запись данных, размер которого не более чем машинное слово?02.03.2018, 22:16. Показов 3578. Ответов 61
Метки нет (Все метки)
Насколько я знаю атомарность для чтения и записи данных которые не более чем одно машинное слово, гарантируется на уровне процессора. А со стороны стандарта с++ есть подобные гарантии? Тут речь не про std::atomic, а именно про обычные переменные.
0
|
|
| 02.03.2018, 22:16 | |
|
Ответы с готовыми решениями:
61
Найти минимальный элемент, двоичная запись которого заканчивается не более чем двумя нулями
Из 8 машинных слов сформировать новое машинное слово. Подсчитать количество идентичных слов в сегменте данных. |
|
What a waste!
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
|
||
| 08.03.2018, 02:29 | ||
|
TRam_, в контексте вопроса ТС, тут скорее проблема не в "устаревших значениях", а в том, что можно получить значение, которое только частично "обновилось", если операции чтения/записи не атомарны.
Добавлено через 22 минуты ТС же интересует, есть ли определённые гарантии атомарности стандартных типов в стандарте языка.
1
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|
| 08.03.2018, 02:43 | |
|
gray_fox, если работать на однопроцессорной машине/в одном потоке и никакие прерывания/другие потоки не меняют переменные этой программы, то ситуации что "частично обновилось" не бывает. Просто потому, что код будет выполняться строго последовательно, а "частичное обновление" подразумевает то, что в выполнение программы как-то вклинились между какими-то из последовательных операций обновления переменной.
Добавлено через 9 минут По тому же принципу мьютексы/семафоры в однопоточной программе бессмысленны - потому что могут привести только к зависанию из-за самоблокировки потока, или просто будут бесполезно жрать ресурсы, закрываясь и открываясь.
0
|
|
|
What a waste!
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
|
||
| 08.03.2018, 02:45 | ||
|
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 08.03.2018, 02:48 | ||
|
0
|
||
|
What a waste!
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
|
|
| 08.03.2018, 03:02 | |
|
Потому что это очевидно не так.
Добавлено через 5 минут Ну допустим... Но в любом случае это конкретная конфигурация, которая не имеет никакого отношения к изначальному вопросу. Добавлено через 8 минут
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||
| 08.03.2018, 03:16 | ||
|
Случай, если у нас однопоточная программа, разобран выше. Остаётся случай, когда у нас многопоточная программа и процессор одноядерный или с синхронизацией кэшей, то для него могло быть что-то записано в стандарте (так как да, атомарность операций с машинным словом тут была бы логична). Но он же частный.
0
|
||
|
What a waste!
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
|
||
| 08.03.2018, 04:33 | ||
|
Атомарность (в контексте операции) значит, что операция либо не произошла (значение не изменилось), либо произошла (значение изменилось). Нет промежуточных состояний (часть операции прошла, а часть нет), соответственно нельзя "увидеть" промежуточное состояние (например, когда половина переменной приняла новое значение, а вторая ещё хранит старое). Но это не значит, что изменения сразу будут видимы в контексте другого потока (будь он на том же ядре, процессоре или где ещё). Уверен ТС интересует именно это. Видимость значит, как другие (относительно текущего) потоки могут видеть состояние переменной: тут уже зависит от 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-битное присваивание.
1
|
||||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
|
| 08.03.2018, 12:11 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 08.03.2018, 13:41 [ТС] | ||
|
Ygg,
Спасибо за статью! Добавлено через 8 минут Попробую ответить пока gray_fox нет Может добавит что-то При этом у каждого ядра свой кэш Учитывая то что каждый поток выполняется на отдельном ядре (физическом или логическом) То если поток А что-то записал себе в кэш, это вовсе не значит что поток Б тут же увидит это значение Поток Б будет работать со своим кэшем и у него вполне может быть другое значение для этой же переменной Но ядра могут обмениваться своми кэшами Под актуальностью подразумевается то, что при чтении данных используя барьеры памяти поток Б может забрать к себе в кэш то что записал поток А... (подразумевается что поток А был последним который что либо записал в эту переменную). И чтение этих данных потоком Б будет строго после того как завершится синхронизация кэшей. Насчет логических ядер - синхронизация скорее всего не понадобится т.к у них вроде как должен быть общий кэш для данных.... Но не уверен...
0
|
||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||
| 08.03.2018, 13:47 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 08.03.2018, 13:54 [ТС] | ||
|
Там все это объясняется понятиями "происходит раньше", "синхронизируется-с" и т.п
0
|
||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
|||
| 08.03.2018, 16:08 | |||
|
Если последнее значение из modification order (http://eel.is/c++draft/intro.r... tion_order) — то есть. Но в таком случае утвержедние про то, что load-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 | |||
|
Добавлено через 2 минуты Но, как я уже говорил, никто чтению с memory_order_acquire не гарантирует получения этого последнего значения.
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||
| 09.03.2018, 09:23 [ТС] | ||||
Так же по вашей ссылке:
Атомарная операция store с освобождением (memory_order_release), синхронизируется с загрузкой acquire (memory_order_acquire), которая получает значение, сохраненное при помощи store операции. То есть acquire-читатель видит то, что сохранил release-писатель для той же самой атомарной переменной. Исходя из написанного, поведение, о котором идет речь, именно что гарантируется... Отсюда возникает вопрос - что по вашему не так?
0
|
||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||||
| 09.03.2018, 12:21 | ||||
|
В обратную сторону это тоже работает: с теми, которые не прочитали значение — не синхронизируются.
0
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 09.03.2018, 13:16 [ТС] | ||
|
Ладно... Может мы просто не понимаем друг друга
0
|
||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||||||
| 09.03.2018, 14:38 | ||||||
"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:
Вернёмся к синхронизации через чтение значения
Зачем написано про любое значение из release sequence, если у нас якобы есть гарантия, что load-acquire (с memory_order ≠ seq_cst) гарантированно читает последнее значение из modification order?
1
|
||||||
|
|
||||
| 09.03.2018, 16:05 | ||||
|
1. Непосредственная атомарность операции - т.е. гарантия того, что, например, при чтении из памяти, мы получим либо старое, либо новое значение (и никаких комбинаций, когда один байт старый, а другой новый) 2. Семантика операции (release, acquire, relaxed и т.п.) - не знаю, как этот параметр по умному называется. Т.е. учёт аппаратных особенностей исполнения операций чтения-записи Кто-то под атомарностью подразумевает только п.1. (т.е. истинную смысловую нагрузку слова "атомарный"), а кто-то - одновременно п.1 и п.2. (т.е. смысл, который вкладывается в стандарты интерфейсов "atomic") Добавлено через 5 минут
0
|
||||
| 09.03.2018, 16:05 | |
|
Как увеличить размер загружаемого файла более чем 100М ? Определить существует ли кандидат, за которого проголосовало более чем половина избирателей
Чтение чисел из двух и более файлов и запись в векторы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 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
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|