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 ответов

9 просмотров

Здравствуйте! Я 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/.

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
49
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
@HemulGM Параметры у AddStream поменялись? Несостыковка какая-то
Катерина Свиридова
12
Подскажите, есть какие-то события создания/уничтожения у TFrame по типу TForm (OnCreate и OnClose/OnDestroy) ? Как отловить создание TFrame и "перед" уничтожением. На Tframe р...
Денис
8
а чем хуже?
Alexey Kulakov
10
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
1
Карта сайта