172 похожих чатов

Добрый день читаю книжку по атомикам и не могу понять пример

в упор


static X: AtomicI32 = AtomicI32::new(0);

fn a() {
X.fetch_add(5, Relaxed);
X.fetch_add(10, Relaxed);
}

fn b() {
let a = X.load(Relaxed);
let b = X.load(Relaxed);
let c = X.load(Relaxed);
let d = X.load(Relaxed);
println!("{a} {b} {c} {d}");
}


говорится что аутпут "0 0 10 15" невозможен

в книге дается следующее объяснение

In this example, only one thread modifies X, which makes it easy to see that there’s only one possible order of modification of X: 0→5→15. It starts at zero, then becomes five, and is finally changed to fifteen. Threads cannot observe any values from X that are inconsistent with this total modification order. This means that "0 0 0 0", "0 0 5 15", and "0 15 15 15" are some of the possible results from the print statement in the other thread, while an output of "0 5 0 15" or "0 0 10 15" is impossible.

Even if there’s more than one possible order of modification for an atomic variable, all threads will agree on a single order.

вопрос: разве компилятор или процессор не может поменять местами fetch_add операции ели они relaxed? в частности меня интересует почему вот этот аутпут невозможен "0 0 10 15"

так же кажется что эти две фразы противоречат друг другу

which makes it easy to see that there’s only one possible order of modification of X: 0→5→15

Even if there’s more than one possible order of modification for an atomic variable, all threads will agree on a single order.

1 ответов

23 просмотра

Здравствуйте! Я Bing, и я могу помочь вам с вашим вопросом о Rust.😊 Я нашел несколько источников, которые объясняют, как работают атомарные операции с разными порядками памяти в Rust. В частности, я нашел этот ответ на Stack Overflow⁴, который говорит: > You'd need to use "release" ordering in your producer and "acquire" ordering in your consumer. This ensures that the data mutation occurs before the AtomicBool is set to true. Таким образом, если вы используете Relaxed ordering для fetch_add операций, то вы не можете гарантировать, что другие потоки увидят последовательность изменений X: 0→5→15. Возможно, что один поток увидит X: 0→10→15, а другой поток увидит X: 0→15. Это нарушает правило, что все потоки должны согласовать один порядок изменения для атомарной переменной¹. Поэтому аутпут "0 0 10 15" невозможен, потому что он подразумевает, что один поток увидел X: 0→10, а другой поток увидел X: 10→15. Это не соответствует единому порядку изменения X. Две фразы из книги не противоречат друг другу. Первая фраза говорит о том, что в этом примере есть только один возможный порядок изменения X: 0→5→15, потому что только один поток модифицирует X. Вторая фраза говорит о том, что даже если есть несколько возможных порядков изменения для атомарной переменной (например, если несколько потоков модифицируют ее), все потоки должны согласовать один из них. Надеюсь, это поможет вам понять пример. Если у вас есть еще вопросы или вы хотите узнать больше о Rust, я всегда рад помочь!😊 Source: Conversation with Bing, 20/05/2023 (1) rust - Loading a counter with Relaxed ordering - Stack Overflow. https://stackoverflow.com/questions/75392755/loading-a-counter-with-relaxed-ordering. (2) Ordering in std::sync::atomic - Rust - Learn Rust. https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html. (3) rust - Which std::sync::atomic::Ordering to use? - Stack Overflow. https://stackoverflow.com/questions/30407121/which-stdsyncatomicordering-to-use. (4) Ordering in atomic - Rust - Docs.rs. https://docs.rs/atomic/latest/atomic/enum.Ordering.html. (5) threadpool - Rust - Docs.rs. https://docs.rs/threadpool/latest/threadpool/.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта