Size: a a a

Rust — русскоговорящее сообществo

2020 October 22

DF

Dollar Føølish in Rust — русскоговорящее сообществo
гарантии видимости нет
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
гарантия порядка заключается в том , что операции могут быть объяснены as if они происходили в каком-то тотальном порядке
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
в принципе ты почти правильно сформулировал
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
что если мы увидели одно то увидим и другие, но дело в том что
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
чтение атомика не гарантирует прочтение последнего именно значения если это не RMW операция
источник

АГ

Алексей Герасимов... in Rust — русскоговорящее сообществo
правильно понимаю что это из-за того что компилятор может переупорядочить операции в каждом треде, поставив в обоих лоад на первое место?
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
нет, компилятор не переупорядочивает их
источник

M

Mnwa in Rust — русскоговорящее сообществo
Dollar Føølish
чтение атомика не гарантирует прочтение последнего именно значения если это не RMW операция
Спасибо
А как мы можем на расте такое гарантировать?
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
exchange например
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
или compare_exchange
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
да даже fetch_add
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
тогда RMW операция увидит последнее значение (in modification order)
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
на х86 просто залочится системная шина до этой ячейки кэша, так как будет lock инструкция-префикс
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
ну и сбросится стор баффер
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
Dollar Føølish
exchange например
по этим шнягам надо только растовые имена найти, я к сожалению запамятовал
источник

M

Mnwa in Rust — русскоговорящее сообществo
То есть в моем примере все лоады заменить на что-нибудь из этого?
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
кстати, да, попробуйте
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
интересный эксперимент )
источник

M

Mnwa in Rust — русскоговорящее сообществo
use loom::thread;
use loom::sync::atomic::{AtomicUsize, Ordering};
use loom::sync::Arc;

fn main() {
   loom::model(|| {
       let x = Arc::new(AtomicUsize::new(0));
       let y = Arc::new(AtomicUsize::new(0));
       let x1 = x.clone();
       let y1 = y.clone();
       let x2 = x.clone();
       let y2 = y.clone();
       let child_x = thread::spawn(move || {
           x1.store(1, Ordering::SeqCst);
           y1.swap(1, Ordering::SeqCst)
       });
       let child_y = thread::spawn(move || {
           y2.store(1, Ordering::SeqCst);
           x2.swap(1, Ordering::SeqCst)
       });
       let res_x = child_x.join().unwrap();
       let res_y = child_y.join().unwrap();
       assert!(!(res_x == 0 && res_y == 0), "x = {}, y = {}", res_x, res_y);
   })
}

действительно работает
источник

DF

Dollar Føølish in Rust — русскоговорящее сообществo
йуху!
источник