Consider this example:
use std::sync::{atomic::{AtomicBool, AtomicI32, Ordering}, Arc};
fn main(){
let flag = Arc::new(AtomicBool::new(false));
let flag2 = flag.clone();
let val = Arc::new(AtomicI32::new(0));
let val2 = val.clone();
let t1 = std::thread::spawn(move ||{
val.store(1, Ordering::SeqCst); // #1
flag.store(true, Ordering::Relaxed); // #2
});
let t2 = std::thread::spawn(move ||{
while !flag2.load(Ordering::Relaxed){} // #3
let r2 = val2.swap(3, Ordering::SeqCst); // #4
assert!(r2 == 1); // #5
});
t1.join().unwrap();
t2.join().unwrap();
}
Can the assertion at #5
fail?