LINUX.ORG.RU

C++, std::atomic, memory_order_release, memory_order_acquire.

 


0

5

Почитаем вражеских сайтов.

http://en.cppreference.com/w/cpp/atomic/memory_order

If an atomic store in thread A is tagged memory_order_release and an atomic load in thread B from the same variable is tagged memory_order_acquire, all memory writes (non-atomic and relaxed atomic) that happened-before the atomic store from the point of view of thread A, become visible side-effects in thread B...

Перевод примерно такой: если атомарная запись в потоке A сделана с флагом «memory_order_release» и атомарное чтение в потоке B из той же переменой сделано с флагом «memory_order_acquire», то любая запись в память перед вышеуказанной атомарной записью будет видна потоку B.

Как-то тупо звучит. Даже без атомарности, барьеров памяти и т.п. поток B увидит в памяти всё, что нафигачил поток А. Правда в неопределённом порядке. Но тут про порядок ничего сказано и не было.

Во-вторых зря они написали «same variable». Барьеры памяти разве следят за тем КУДА пишут и ОТКУДА читают? Они вроде просто препятствуют переходу через себя ЛЮБЫХ операций некого типа (напр. записи или чтения), неважно с какой именно переменной идёт работа - с той же или не с той же.

Конечно там дальше написано

...that is, once the atomic load is completed, thread B is guaranteed to see everything thread A wrote to memory.
Но это «that is» никак логически не вытекает из бреда идущего до этого.

Сайт писали тормоза?



Последнее исправление: hlamotron (всего исправлений: 3)
Ответ на: комментарий от tailgunner

Нет, там всё логично. Это просто ты тупой.

На тебе повисло сразу 2 подозрения:
1. Какой ты тупой, если такой бред для тебя логичен
2. Подтверждением к тому, что ты тупой явилось то, что ты не написал аргументов к своему высеру

hlamotron
() автор топика

Если для тебя краткая справка - слишком сложно, то поищи книги на данную тему с картинками.

anonymous
()
Ответ на: комментарий от theNamelessOne

Цитирование делается тегом quote (> как шорткат), только мудаки цитируют с помощью тега code.

Твоё наблюдение разбилось о реальность, в которой умный человек (я) процитировал через code. Советую не оставлять разорванный шаблон, а скорее лечить.

hlamotron
() автор топика
Ответ на: комментарий от theNamelessOne

Оо лор-буллинг во всей красе)

А что касается цитат, то таки да: с телефона это невозможно читать, поэтому я Ъ в квадрате.

asaw ★★★★★
()

Documentation/memory-barriers.txt уже советовали?

Даже без атомарности, барьеров памяти и т.п. поток B увидит в памяти всё, что нафигачил поток А. Правда в неопределённом порядке.

А что если поток B начнёт исполняться на своём процессоре до того, как его кеш будет синхронизирован с кешем процессора, где исполняется A?

Во-вторых зря они написали «same variable». Барьеры памяти разве следят за тем КУДА пишут и ОТКУДА читают?

Не зря. Барьеры, ограниченные одним кусочком памяти, являются более выразительными, чем барьеры на весь кеш сразу. То есть первые можно заменить вторыми без потери семантики. Так что формулировка с same value накладывает меньше ограничений на реализацию.

ilammy ★★★
()

Как-то тупо звучит. Даже без атомарности, барьеров памяти и т.п. поток B увидит в памяти всё, что нафигачил поток А.

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

dzidzitop ★★
()

Во-вторых зря они написали «same variable». Барьеры памяти разве следят за тем КУДА пишут и ОТКУДА читают?

бывают не только архитектуры IA32 и amd64. а компиляторы могут творить чудеса с перестановками инструкций. а язык даёт гарантии в форме, которая распространяется на любую архитектуру и компилятор. читать нужно буквально и следовать строго. иначе можно словить сюрпризы.

dzidzitop ★★
()

Сайт писали тормоза?

стандарт плюсовый почитай. сайт - это перепевка стандарта.

dzidzitop ★★
()
Ответ на: комментарий от ilammy

во-првых, документ по ссылке описывает модель памяти в понимании ядра. корректней давать ссылку на архитекуру конкретного цпу.

во-вторых, при чем тут кэши?

anonymous
()
Ответ на: комментарий от dzidzitop

Так во фразе ничего не сказано про «когда». Сказано просто «поток B увидит». Так ведь поток B рано или поздно всё увидит.

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Так ведь поток B рано или поздно всё увидит.

И это умный человек? Скомпиль с О2 программу типа

int x = 0;
thread([&x]() { x = 1; }).detach();
while (!x);

vzzo ★★★
()
Ответ на: комментарий от intelfx

Ты? Умный человек? Ты даже страничку с cppreference не можешь осилить.

Т.е. ты считаешь, что там написано не говно?

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Ты? Умный человек? Ты даже страничку с cppreference не можешь осилить.

Т.е. ты считаешь, что там написано не говно?

Ты процитируй сначала нормально, если хочешь что бы кто-нибудь прочитал.

Stil ★★★★★
()
Ответ на: комментарий от Stil

Ты процитируй сначала нормально, если хочешь что бы кто-нибудь прочитал.

Более точной передачи информации, чем использованная тут копипаста ещё не придумано. Ты хочешь чтобы я пропустил копипасту через улучшатель качества информации?

hlamotron
() автор топика
Ответ на: комментарий от intelfx

Да, там вполне внятно написано.

Так понятно написано, а ты даже не понял что там нет ни слова про последовательность событий? )

hlamotron
() автор топика
Ответ на: комментарий от hlamotron

Там есть все нужные слова. У тебя в посте бред начиная со второго абзаца.

intelfx ★★★★★
()
Ответ на: комментарий от hlamotron

И в чём проблема? Рано или поздно x будет изменена.

Но главный поток этого никогда не увидит.

vzzo ★★★
()
Ответ на: комментарий от hlamotron

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

dzidzitop ★★
()
Ответ на: комментарий от tailgunner

это data race. в C++ это UB. а прав компилятор будет, потому что оптимизировать будет нечего в противном случае.

в любом случае - такая оптимизация соответствует стандарту. так что не о чем говорить.

dzidzitop ★★
()
11 марта 2018 г.
Ответ на: комментарий от dzidzitop

там написано всё правильно.

Ну, так себе. Слишком неформально. Не сделан акцент на том, что поток B должен прочитать значение атомарной переменной, записанное потоком A, чтобы синхронизироваться с ним. Т.е. не то, что не сделан акцент, а об этом вообще не сказано!

anonymous
()

Но тут про порядок ничего сказано и не было.

Хер с ним, с точным смыслом термина в C++, но ведь можно просто в переводчик загнать слова «happened-before» и увидеть, что про порядок сказано.

Во-вторых зря они написали «same variable». Барьеры памяти разве следят за тем КУДА пишут и ОТКУДА читают?

Ты даже не заметил, что там написано не про барьеры (std::atomic_thread_fence)?

anonymous
()
Ответ на: комментарий от hlamotron

Модель памяти C++ так не считает.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.