Функция fence
Функция fence из модуля std::sync устанавливает барьер памяти с заданным порядком упорядочивания. Она не выполняет никаких атомарных операций сама по себе, но гарантирует, что все операции чтения и записи до барьера будут видны другим потокам в правильном порядке относительно операций после барьера. Параметром функция принимает значение перечисления Ordering, которое задаёт тип барьера памяти.
Синтаксис
std::sync::atomic::fence(order: Ordering)
Пример
Давайте установим барьер памяти с порядком SeqCst и выполним атомарную запись:
use std::sync::atomic::{AtomicUsize, fence, Ordering};
fn main()
{
let data = AtomicUsize::new(0);
data.store(1, Ordering::Relaxed);
fence(Ordering::SeqCst);
data.store(2, Ordering::Relaxed);
println!("{}", data.load(Ordering::SeqCst));
}
Результат выполнения кода:
2
Пример
Давайте используем барьер Acquire после записи флага готовности, чтобы гарантировать видимость данных:
use std::sync::atomic::{AtomicBool, AtomicUsize, fence, Ordering};
fn main()
{
let ready = AtomicBool::new(false);
let data = AtomicUsize::new(0);
data.store(42, Ordering::Relaxed);
fence(Ordering::Release);
ready.store(true, Ordering::Relaxed);
if ready.load(Ordering::Relaxed) {
fence(Ordering::Acquire);
println!("{}", data.load(Ordering::Relaxed));
}
}
Результат выполнения кода:
42
Смотрите также
-
перечисление
Ordering,
которое задаёт порядок упорядочивания операций -
тип
AtomicUsize,
который представляет атомарное целое число без знака -
метод
load,
который атомарно читает значение -
метод
store,
который атомарно записывает значение