1use prism3_atomic::AtomicI32;
14use std::sync::Arc;
15use std::thread;
16
17fn main() {
18 println!("=== Atomic Counter Example ===\n");
19
20 println!("1. Basic Counter Operations:");
22 let counter = AtomicI32::new(0);
23 println!(" Initial value: {}", counter.load());
24
25 counter.fetch_inc();
26 println!(" After increment: {}", counter.load());
27
28 counter.fetch_add(5);
29 println!(" After adding 5: {}", counter.load());
30
31 counter.fetch_dec();
32 println!(" After decrement: {}", counter.load());
33
34 println!("\n2. Multi-threaded Counter:");
36 let counter = Arc::new(AtomicI32::new(0));
37 let num_threads = 10;
38 let increments_per_thread = 1000;
39
40 let mut handles = vec![];
41 for i in 0..num_threads {
42 let counter = counter.clone();
43 let handle = thread::spawn(move || {
44 for _ in 0..increments_per_thread {
45 counter.fetch_inc();
46 }
47 println!(" Thread {} completed", i);
48 });
49 handles.push(handle);
50 }
51
52 for handle in handles {
53 handle.join().unwrap();
54 }
55
56 println!(
57 " Final count: {} (expected: {})",
58 counter.load(),
59 num_threads * increments_per_thread
60 );
61
62 println!("\n3. Compare-and-Swap:");
64 let counter = AtomicI32::new(10);
65 println!(" Initial value: {}", counter.load());
66
67 match counter.compare_set(10, 20) {
68 Ok(_) => println!(" CAS succeeded: value is now {}", counter.load()),
69 Err(actual) => println!(" CAS failed: actual value was {}", actual),
70 }
71
72 match counter.compare_set(10, 30) {
73 Ok(_) => println!(" CAS succeeded: value is now {}", counter.load()),
74 Err(actual) => println!(" CAS failed: actual value was {}", actual),
75 }
76
77 println!("\n4. Functional Updates:");
79 let counter = AtomicI32::new(5);
80 println!(" Initial value: {}", counter.load());
81
82 let old = counter.fetch_update(|x| x * 2);
83 println!(" After doubling - old: {}, new: {}", old, counter.load());
84
85 let new = counter.fetch_update(|x| x + 10);
86 println!(" After adding 10 - new: {}", new);
87
88 println!("\n5. Accumulate Operations:");
90 let counter = AtomicI32::new(1);
91 println!(" Initial value: {}", counter.load());
92
93 let old = counter.fetch_accumulate(2, |a, b| a * b);
94 println!(
95 " After multiplying by 2 - old: {}, new: {}",
96 old,
97 counter.load()
98 );
99
100 let new = counter.fetch_accumulate(3, |a, b| a + b);
101 println!(" After adding 3 - new: {}", new);
102
103 println!("\n=== Example completed ===");
104}