Size: a a a

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

2020 October 22

DF

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

M

Mnwa in Rust — русскоговорящее сообществo
Интересные вещи происходят, спасибо)
источник

DF

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

M

Mnwa in Rust — русскоговорящее сообществo
Да я там и читал про seqcst, прост не так понял, видимо
источник

M

Mnwa in Rust — русскоговорящее сообществo
Dollar Føølish
чтение атомика не гарантирует прочтение последнего именно значения если это не RMW операция
Правильно я понимаю, что в моем примере такое проскакивает только из-за эмуляции loom, а на std варианте и x86 архитектуре такого не произойдёт?
Интерес больше академический)
источник

DF

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

DF

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

DF

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

D

Dima 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
Это баг loom-а видимо
источник

DF

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

M

Mnwa in Rust — русскоговорящее сообществo
Спасибо, попробую потом упростить пример и почекать asm
источник

M

Mnwa in Rust — русскоговорящее сообществo
Dima
Это баг loom-а видимо
То есть на seqcst все должно работать таки?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Ну в дискорде написали, что должно работать
источник

M

Mnwa in Rust — русскоговорящее сообществo
А ещё написали, что не должно)
Одна путаница
источник

D

Dima in Rust — русскоговорящее сообществo
Mnwa
То есть на seqcst все должно работать таки?
источник

M

Mnwa in Rust — русскоговорящее сообществo
Спасибо, прочту
источник

r

red75prime in Rust — русскоговорящее сообществo
Dollar Føølish
надо асм смотреть который он генерит
в первоначальном варианте лод = мув, а стор = мув + мфенс
C load'ом - mov, со swap - xchg. https://godbolt.org/z/aj3GrY
источник

M

Mnwa in Rust — русскоговорящее сообществo
Вообще да, я про такое же поведение и думал, но не смог нормально мысль донести
источник

M

Mnwa in Rust — русскоговорящее сообществo
Завёл ребятам issue
https://github.com/tokio-rs/loom/issues/180
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Может, есть какой-то крейт для IPC?
Я хочу:
1. В одном процессе поднять «сервер»
2. Сервер должен отдать некую строку
3. По этой некой строке к нему должен мочь подключиться (на том же компьютере) клиент
4. По такому коннекту я хочу гонять туда-сюда обычные растовые структуры (можно имплементировать (De)Serialize)
источник