Size: a a a

Compiler Development

2020 January 11

EM

Evgenii Moiseenko in Compiler Development
Ioann_V
ну вот смотрите, про неочевидное поведение в комментарии Михаила:
Т2 пишет У = 1, релизом, Т3 грузит экваером, как он может не увидеть? Или, что вы имееете в виду под отсутствием гарантий откуда прочитает?
по поводу seq_cst — если у вас в программе все атомики с seq_cst, тогда гарантируется seq_cst семантика и "иллюзия" про глобальную память работает,
если в программе есть другие атомики, помимо seq_cst, то понять смысл seq_cst простым смертным не дано
источник

EM

Evgenii Moiseenko in Compiler Development
я вот слабо понимаю ))
источник

I

Ioann_V in Compiler Development
А верно ли я понимаю, что если один поток пишет что-то releas-ом, а другой читает, acq, то, вообще говоря, не факт, что тот поток, что читает acq, увидит эту запись, сделанную releasом в другом потоке?
источник

I

Ioann_V in Compiler Development
Мы говорим о чтении-записи одной и той же переменной? Если да, то нет, не верно. Если бы это было так, то mutex или spinlock не работали бы
источник

EM

Evgenii Moiseenko in Compiler Development
Ioann_V
А верно ли я понимаю, что если один поток пишет что-то releas-ом, а другой читает, acq, то, вообще говоря, не факт, что тот поток, что читает acq, увидит эту запись, сделанную releasом в другом потоке?
да верно
источник

I

Ioann_V in Compiler Development
А Хижинский Максим, говорит, что не верно
источник

I

Ioann_V in Compiler Development
Он если что автор статей на Хабре по Лок Фри.
источник

EM

Evgenii Moiseenko in Compiler Development
в spin lock есть цикл
источник

I

Ioann_V in Compiler Development
И автор какой то там крупной библиотеки с лок фри. Ничей авторитет под сомнение не ставлю.
источник

I

Ioann_V in Compiler Development
Просто запутался от А до Я....
источник

EM

Evgenii Moiseenko in Compiler Development
т.е. спин лок это очень упрощая примерно следующее
T1: x_rlx := 42; y_rel := 1
T2 : while (!r1) r1 := y_acq ; r2 := x_rlx
источник

AS

Aleksey Shipilev in Compiler Development
В вашем вопросе есть интуитивное понятие "времени". Вы по сути спрашиваете, "если один поток сделал запись, то должен ли другой поток, прочитавший переменную *после* этого, увидеть эту запись". Вот в слове "после" подразумевается время. А его нет! <сибирский-фермер.jpg> И поэтому никакого интуитивное "после" тоже нет... "После" появится, когда читатель таки увидит событие.
источник

BD

Berkus Decker in Compiler Development
Ioann_V
А верно ли я понимаю, что если один поток пишет что-то releas-ом, а другой читает, acq, то, вообще говоря, не факт, что тот поток, что читает acq, увидит эту запись, сделанную releasом в другом потоке?
Happens before, happens before everywhere
источник

I

Ioann_V in Compiler Development
Evgenii Moiseenko
в spin lock есть цикл
а в вашем примере, 0 возможен только если Т3, прочтет значение до того как т2 его установит и только в этом случае?
источник

EM

Evgenii Moiseenko in Compiler Development
Ioann_V
а в вашем примере, 0 возможен только если Т3, прочтет значение до того как т2 его установит и только в этом случае?
не понял, в каком конкретно примере ?
в спин локе возможно только r2 читает 42, благодаря чтению y_acq в цикле
источник

I

Ioann_V in Compiler Development
Evgenii Moiseenko
давайте ещё один классический пример рассмотрим, чтобы понять для чего нужно acq/rel

T1: x_rlx = 42; y_rel =1
T2: r1 = y_acq; r2 = x_rlx

смотрите, тут во втором потоке в r1 может быть прочитано или 0, или 1
Если 0, то на чтение r2 = x_rlx нет никаких гарантий, мб прочитано как 0 так и 42,
но если в r1 было прочитано 1, то в r2 обязано быть прочитано 42
this
источник

EM

Evgenii Moiseenko in Compiler Development
если бы в цикле читали y_rlx, то было бы возможно r2 читает 0
источник

BD

Berkus Decker in Compiler Development
Ioann_V
а в вашем примере, 0 возможен только если Т3, прочтет значение до того как т2 его установит и только в этом случае?
Он может прочитать и «после», суть в том что никакого до и после тут нет)
источник

K

Kir in Compiler Development
Use Control.Concurrent.STM, это всё, что я могу посоветовать. И вопросов о синхронизации не будет.
источник

EM

Evgenii Moiseenko in Compiler Development
Berkus Decker
Он может прочитать и «после», суть в том что никакого до и после тут нет)
☝️☝️☝️
источник