Size: a a a

2021 April 25

K

Kerrigan in codingteam
какие шрифты вкусные
источник

c

codingteam@cjr in codingteam
Minoru
acquire запрещает переставлять чтения, идущие перед ним, за барьер
источник

c

codingteam@cjr in codingteam
Minoru
release запрещает переставлять записи, идущие за ним, до барьера
источник

t

ttldtor in codingteam
я не шарю... выглядит, будто в TeX делали
источник

K

Kerrigan in codingteam
ну так то и есть
источник

c

codingteam@cjr in codingteam
Minoru
sequentially consistent acquire and release запрещает вообще что-либо переставлять через барьер
источник

c

codingteam@cjr in codingteam
Minoru
давай представим, как из этого собрать простенькую синхронизацию
источник

c

codingteam@cjr in codingteam
Minoru
у нас будет некий producer, генерирующий данные, и consumer, который их читает. Они будут синхронизироваться с помощью volatile bool
источник

t

ttldtor in codingteam
@noktoborus  беги!
источник

c

codingteam@cjr in codingteam
Minoru
producer должен сгенерировать данные, записать их в общую память, и выставить флаг
источник

c

codingteam@cjr in codingteam
Minoru
consumer должен busy-wait-ить в ожидании флага, а затем прочесть данные
источник

c

codingteam@cjr in codingteam
Minoru
какие тут риски от перестановки операций? Риск для producer в том, что установка флага произойдёт до того, как будут записаны данные. Для consumer риск в том, что чтение данных произойдёт до того, как завершится busy-wait
источник

c

codingteam@cjr in codingteam
Minoru
поэтому в producer перед установкой флага мы поставим release fence, записи после которого нельзя перемещать за барьер. Т.е. флаг *точно* будет записан уже после того, как выполнена запись данных
источник

c

codingteam@cjr in codingteam
Minoru
в consumer мы поставим acquire fence после цикла, делающего busy-wait. Это не даст железу раньше времени читать данные — придётся дождаться, пока не будет установлен флаг
источник

c

codingteam@cjr in codingteam
Minoru
вроде, всё. Вопросы, @noktoborus?
источник

c

codingteam@cjr in codingteam
Minoru
по-моему, я где-то профукал какие-то перестановки, найдо пойти прочесть ещё раз на эту тему
источник

c

codingteam@cjr in codingteam
Minoru
о, надо было сразу доки на Раст читать, там по-человечески написано:
> with SeqCst, no re-ordering of reads and writes across this point is allowed.
> with Release, preceding reads and writes cannot be moved past subsequent writes.
> with Acquire, subsequent reads and writes cannot be moved ahead of preceding reads.
> with AcqRel, both of the above rules are enforced.
https://doc.rust-lang.org/std/sync/atomic/fn.compiler_fence.html
источник

c

codingteam@cjr in codingteam
Minoru
ну что ж, правила я запомнил только наполовину
источник

c

codingteam@cjr in codingteam
Minoru
а, стоп, это дока на компилятор, а не инструкции для железа
источник

c

codingteam@cjr in codingteam
Minoru
ладно, пойду поем лучше
источник