Size: a a a

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

2020 October 22

Э

Эрик in Rust — русскоговорящее сообществo
Mnwa
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.load(Ordering::SeqCst)
       });
       let child_y = thread::spawn(move || {
           y2.store(1, Ordering::SeqCst);
           x2.load(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, второй пишет в y единицу и читает из x
А это точно проблема именно раста, а не SeqCst? Там вроде бы были какие-то баги у самого SeqCst.
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
а почему не может быть оба нуля?
источник

M

Mnwa in Rust — русскоговорящее сообществo
Не исключаю, просто у плюсов seqcst гарантирует ордеринг глобальных атомиков вроде как и такого просто быть не может
То есть не release acquire еще ок, но вот SeqCst вродь должен это фиксить
источник

Э

Эрик in Rust — русскоговорящее сообществo
David Sorokin
а почему не может быть оба нуля?
Атомик в арках, плюс SeqCst.
источник

DF

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

D

Denis in Rust — русскоговорящее сообществo
Mnwa
В общем, в loom проскакивает ситуация, когда x и y равны 0 одновременно и этот assert паникует
если что, ассерт у тебя срабатывает, когда любой res_ равен нулю
источник

DF

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

DF

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

DS

David Sorokin in Rust — русскоговорящее сообществo
а если потоки попали на разные ядра?
источник

DS

David Sorokin in Rust — русскоговорящее сообществo
а там кеши
источник

r

red75prime in Rust — русскоговорящее сообществo
David Sorokin
а там кеши
Для атомиков есть протокол синхронизации кэшей
источник

DF

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

DF

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

Э

Эрик in Rust — русскоговорящее сообществo
Denis
если что, ассерт у тебя срабатывает, когда любой res_ равен нулю
Хм, а парень прав. И тогда никаких багов нет, просто второй тред запускается дольше, чем работает первый.
источник

M

Mnwa in Rust — русскоговорящее сообществo
Эрик
Хм, а парень прав. И тогда никаких багов нет, просто второй тред запускается дольше, чем работает первый.
Вот да, кажись оно)
источник

M

Mnwa in Rust — русскоговорящее сообществo
Хотя на assert!(!(res_x == 0 && res_y == 0)); тож фейлится
источник

D

Denis in Rust — русскоговорящее сообществo
сделай вывод res_x, res_y
источник

D

Denis in Rust — русскоговорящее сообществo
assert!(res_x != 0 || res_y != 0, "x = {}, y = {}", res_x, res_y)
источник

Э

Эрик in Rust — русскоговорящее сообществo
assert!(res_x != 0 || res_y != 0)
источник

M

Mnwa in Rust — русскоговорящее сообществo
assert!(!(res_x == 0 && res_y == 0), "x = {}, y = {}", res_x, res_y);
источник