mirror of
https://github.com/PacktPublishing/Rust-High-Performance.git
synced 2026-01-25 02:34:19 +09:00
40 lines
1.3 KiB
Rust
40 lines
1.3 KiB
Rust
use std::thread;
|
|
use std::sync::Arc;
|
|
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
|
|
|
|
fn main() {
|
|
let my_val = AtomicUsize::new(0);
|
|
let pointer = Arc::new(my_val);
|
|
let lock = Arc::new(AtomicBool::new(false));
|
|
|
|
let t_pointer = pointer.clone();
|
|
let t_lock = lock.clone();
|
|
let handle = thread::Builder::new()
|
|
.name("my thread".to_owned())
|
|
.spawn(move || {
|
|
for _ in 0..250_000 {
|
|
while t_lock.compare_and_swap(false, true, Ordering::Relaxed) {}
|
|
let cur_value = t_pointer.load(Ordering::Relaxed);
|
|
let sum = cur_value + 1;
|
|
t_pointer.store(sum, Ordering::Relaxed);
|
|
t_lock.store(false, Ordering::Relaxed);
|
|
}
|
|
})
|
|
.expect("could not create the thread");
|
|
|
|
for _ in 0..250_000 {
|
|
while lock.compare_and_swap(false, true, Ordering::Relaxed) {}
|
|
let cur_value = pointer.load(Ordering::Relaxed);
|
|
let sum = cur_value + 1;
|
|
pointer.store(sum, Ordering::Relaxed);
|
|
lock.store(false, Ordering::Relaxed);
|
|
}
|
|
|
|
if handle.join().is_err() {
|
|
println!("Something bad happened :(");
|
|
}
|
|
|
|
let a_int = Arc::try_unwrap(pointer).unwrap();
|
|
println!("Final number: {}", a_int.into_inner());
|
|
}
|