|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Гарантирует ли стандарт атомарное чтение и запись данных, размер которого не более чем машинное слово?02.03.2018, 22:16. Показов 3598. Ответов 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М ? Определить существует ли кандидат, за которого проголосовало более чем половина избирателей
Чтение чисел из двух и более файлов и запись в векторы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики
1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
|
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928
Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
|
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего
Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
|
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы
Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
|
|
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока
Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
|
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
|
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат»
Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
|
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
|