|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Гарантирует ли стандарт атомарное чтение и запись данных, размер которого не более чем машинное слово?02.03.2018, 22:16. Показов 3569. Ответов 61
Метки нет (Все метки)
Насколько я знаю атомарность для чтения и записи данных которые не более чем одно машинное слово, гарантируется на уровне процессора. А со стороны стандарта с++ есть подобные гарантии? Тут речь не про std::atomic, а именно про обычные переменные.
0
|
|
| 02.03.2018, 22:16 | |
|
Ответы с готовыми решениями:
61
Найти минимальный элемент, двоичная запись которого заканчивается не более чем двумя нулями
Из 8 машинных слов сформировать новое машинное слово. Подсчитать количество идентичных слов в сегменте данных. |
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||||
| 09.03.2018, 19:04 [ТС] | |||||||||
![]()
0
|
|||||||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||||||
| 09.03.2018, 19:25 | ||||||
0
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||||
| 09.03.2018, 20:24 [ТС] | ||||||||||
|
В общем случае есть 2 варианта получить значение той или иной переменной из release sequence: 1. Не запускать явную синхронизацию. В таком случае ядро на котором исполняется читающий поток получит измененное значение тогда, когда это ядро "посчитает нужным" забрать его из кэша писателя. 2. Запуск явной синхронизации перед чтением и получение последнего значения. Выбрать конкретную стратегию позволяют memory_order_* То о чем ты говоришь больше похоже на load с memory_order_relaxed и то не всегда. Зависит от модели памяти, которую по умолчанию поддерживает процессор выполняющий код.
0
|
||||||||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
|||||
| 09.03.2018, 21:02 | |||||
|
Перечитай ещё раз определение http://eel.is/c++draft/intro.r... e_sequence. release sequence это определённым образом сформированная подпоследовательность из последовательности модификаций для одного атомарного объекта M. Как из последовательности модификаций одного объекта (переменной) достать значение той или иной переменной? Но такой порядок гарантируется для memory_order_seq_cst, а для memory_order_release/acquire нет понятия "(операция) применена в последний раз".
1
|
|||||
|
|
|
| 09.03.2018, 21:27 | |
|
Мало ли, вдруг кому-то пригодится
Std::atomic. Реализация свободного от блокировок стека
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||||||||||
| 10.03.2018, 00:00 [ТС] | |||||||||||||
|
У меня в голове почему-то крутился пример только с двумя потоками, где один писатель, а другой читатель. Говоря про release sequence, имеется ввиду порядок модификации одной и той же атомарной переменной несколькими потоками. Надеюсь теперь мы на одной волне относительно release sequence? Если так, тогда вернемся к load-acquire. Теперь попробую описать то, почему я считаю что будет прочитано последнее значение и то, что вообще подразумевается под последним значением. Сначала определимся с тем, что все атомарные процессорные инструкции сопровождаются блокировкой на процессорном уровне. https://ru.wikipedia.org/wiki/... 0%B8%D1%8F Это означает, что с данными над которыми производится атомарная процессорная инструкция, в один момент может работать только один поток. Ты задал вопрос, с каким release-store будет синхронизировано load-acquire. В общем мой ответ таков: Допустим есть три потока, где два писателя и один читатель. A и B - писатели, C - читатель и все они предположим что работают с одной и той же атомарной переменной std::atomic. Потоки A и B пишут некоторое значение в атомарную переменную в определенном порядке. Среди них насколько я знаю - кто первый встал, того и тапки (тот первый захватит лок и запишет свое значение). Но тут возникает вопрос, какое из этих значений будет читать поток C. Ты ведь этот вопрос мне задавал? Для читающего ядра последним значением я считаю то значение, от которого читатель в последний раз получит сообщение "я записал новое значение". Если поток С запросит чтение сразу после того как поток A запишет свое значение, то он будет синхронизирован с тем что записал поток А. Если же поток С запросит чтение после того как поток B сделает операцию чтения, то поток С будет синхронизирован с значением, записанным потоком B. Проще говоря, при использовании load-acquire поток пытается прочитать максимально новое (последнее) значение. Каким будет читаемое значение зависит от того, кто и когда будет выполнять свои операции Вот код, при помощи которого я проводил тесты:
Ниже несколько результатов выполнения:
Есть ли у тебя ещё вопросы, или контрпримеры? ... Добавлено через 23 минуты Ниже немного измененный пример. Добавил sleep на 2 секунды в читателе перед load операцией. За 2 секунды думаю оба потока успеют записать свои значения. Как результат - мы всегда видим только одно значение. То есть в результате load-acquire мы прочитали то, что было записано последним.
0
|
|||||||||||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||||||||
| 10.03.2018, 00:02 | ||||||||
![]() А именно:
Как ты тогда ответишь на вопрос, зачем стандарт пишет про получение любого значения из release sequence? Любое-то может быть и не последним... Для того, чтобы показать, что операции над мьютексом происходят в едином для всех потоков порядке и лок мьютекса синхронизируется с последним анлоком (или наоборот, если угодно), не нужно определяться с блокировками на процессорном уровне. Это явно написано. Что memory_order_seq_cst получает последнее значение, тоже более-менее понятно: там все операции глобально упорядочены и этот порядок согласован с modification order (т.е. последняя операция записи соответствует последнему значению в modification order и т.д.). load читает значение, записанное последним release из глобального порядка, а, значит, это будет последнее значение из modification order. И тут не нужны никакие "сначала определимся"! А почему для того, чтобы убедиться в том, что load-acquire (с mem. order != seq_cst) видит последнее значение, я должен определяться с блокировками на процессорном уровне? При том, что некоторые словоупотребления в стандарте, типа того, что я привёл выше, говорят явно против "последнего значения". Добавлено через 1 минуту
0
|
||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 10.03.2018, 00:44 [ТС] | ||||||
|
Мне вот интересно, что здесь есть side effect? Вопрос возникает потому, что есть другие варианты. )
0
|
||||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
|||
| 10.03.2018, 00:50 | |||
|
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 10.03.2018, 01:04 [ТС] | |||
)Вдруг мне даже не придется говорить об этом, зависит от твоего ответа т.к я не уверен, есть просто некоторые подозрения... Обрати внимание, в том предложении упомянуто два разных понятия: 1. release sequence 2. side effects Где стандарт определяет чем является side effects в данном контексте и почему по твоему нельзя было просто обойтись выражением release sequence? Далее load операция всегда извлекает одно и то же значение не смотря на то, что перед load было две операции сохранения. Разве это не говорит о том, что произошла синхронизация, в результате которой было принято одно значение (последнее). Если это не так, то почему?
0
|
|||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||||||||
| 10.03.2018, 01:40 | ||||||||
|
А пока на подобный вопрос я могу дать такой ответ: комитет данным предложением хотел сказать что-то, для чего нельзя было обойтись выражением release sequence, т.к. иначе не получилось бы сказать то, что хотели сказать, а получилось бы сказать то, что не хотели. Могу ещё такой дать: потому что если выкинуть "side effects" — 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
0
|
||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 10.03.2018, 02:10 [ТС] | |||||
Можно было бы донести эту мысль без слов side effects...И тут скорее всего происходит именно чтение данных из последней записи...
0
|
|||||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
|||||||
| 10.03.2018, 02:28 | |||||||
|
Мне показалось, мы уже выяснили, что такое release sequence и что она относится к последовательности модификаций атомарного объекта M. Видимо, только показалось.
0
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 10.03.2018, 02:45 [ТС] | |||
|
То есть если в release sequence было несколько сайд эффектов (например по одному сайд эффекту на каждый store), то читатель увидит действие всех этих побочных эффектов. Слово any тут как я понял именно к сайд эффектам при сохранении (т.е любые сайд эффекты будут завершены на момент чтения), а не к тому что может быть прочитано любое (any) значение. Так программа работает быстрее т.к нет полных барьеров
0
|
|||
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||
| 10.03.2018, 02:54 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 10.03.2018, 02:58 [ТС] | |
|
SeqInconsistent,
Нет... "Берет его значение (его, всмысле store операции), с учётом любых сайд эффектов которые могут быть в release sequence". Я понял это именно так
0
|
|
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
|||
| 10.03.2018, 03:04 | |||
|
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 10.03.2018, 03:25 [ТС] | |
|
SeqInconsistent,
Там any расположено именно что перед side effect, а не перед value... Это означает что слово любое (any) тут относится именно к сайд эффектам а не к значению(value)....
0
|
|
|
6 / 6 / 2
Регистрация: 27.08.2017
Сообщений: 28
|
||
| 10.03.2018, 03:54 | ||
|
Undisputed, ок, я понял, ты прицепился к
Только вот это исправление не сильно тебе помогает. Ты пытаешься доказать, что значение при чтении получается от "последней" записи, а тут выходит, что от любого сайд-эффекта (из release sequence)... Нестыковка. Что делать?
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||
| 10.03.2018, 14:04 [ТС] | ||||||||
|
LoadLoad LoadStore - acquire (все операции чтения идущие ДО барьера будут выполнены ДО всех операций после барьера) LoadLoad относится к до, LoadStore к после барьера. LoadLoad применяются к invalidate queue процессора (заставляет процессор выполнить синхронизацию типа "чтение" с кэшами других процессоров. в эту очередь помещаются сообщения об изменении данных другими ядрами). Теперь разберемся как вообще заполняется этот самый invalidate queue: Каждое ядро при изменении у себя данных (тобишь сделав store), шлет специальное сообщение другим ядрам, у которых тоже есть эта переменная. Ядро получив сообщение об изменении этой переменной кладет информацию об этом в invalidate queue что бы произвести синхронизацию либо сразу по требованию через барьер памяти, либо "как карта ляжет" если нет барьера (почему не синхронизируются сразу? да потому что так быстрее ибо в данный момент этому ядру читать сие значение может быть и не нужно и оно может быть занято чем то другим). Теперь посмотрим чем является atomic load-acquire atomic.load(std::memory_order_acquire) По сути load-acquire можно представить следующим образом:
И теперь это самое ядро перед чтением в переменную int n сбрасывает в кэш все что у него есть в invalidate queue. Потом берет из кэша значение n и записывает в переменную. Если в очереди было несколько значений из release sequence, то кто был последним сообщившим об изменении нужной переменной, значение того потока и будет последним записано в кэш линию данного ядра (принцип FIFO). Вот именно по этой причине я и говорил что будет прочитано последнее значение. Стандарт в свою очередь насколько я понимаю просто требует - запись должна быть синхронизирована с чтением как можно раньше и любая задержка должна быть оправдана.
0
|
||||||||
| 10.03.2018, 14:04 | |
|
Как увеличить размер загружаемого файла более чем 100М ? Определить существует ли кандидат, за которого проголосовало более чем половина избирателей
Чтение чисел из двух и более файлов и запись в векторы
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
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
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|