Added an Example how two threads can modfiy the same Integers using Mutex and Arc
parent
270ad82d4b
commit
9e36ee2d01
|
|
@ -0,0 +1,36 @@
|
|||
use std::sync::{Arc, Mutex};
|
||||
use std::thread;
|
||||
|
||||
fn main() {
|
||||
// 1. Wrap the counter in a Mutex, and wrap that Mutex inside an Arc.
|
||||
// Arc is the Atomic Reference Counter, contrary to the normal reference counter
|
||||
// Arc is saved on the heap
|
||||
let counter = Arc::new(Mutex::new(0));
|
||||
|
||||
// 2. Clone the Arc pointer for Thread 1
|
||||
let counter_clone1 = Arc::clone(&counter);
|
||||
// The word move makes sure that counter_clone1 is also saved on the private stack of handle1
|
||||
let handle1 = thread::spawn(move || {
|
||||
for _ in 0..10 {
|
||||
let mut guard = counter_clone1.lock().unwrap();
|
||||
*guard += 1;
|
||||
}
|
||||
}); // guard drops here, releasing the lock automatically
|
||||
|
||||
// 3. Clone the Arc pointer for Thread 2
|
||||
let counter_clone2 = Arc::clone(&counter);
|
||||
// The word move makes sure that counter_clone2 is also saved on the private stack of handle2
|
||||
let handle2 = thread::spawn(move || {
|
||||
for _ in 0..10 {
|
||||
let mut guard = counter_clone2.lock().unwrap();
|
||||
*guard += 1;
|
||||
}
|
||||
});
|
||||
|
||||
// 4. Wait for both threads to finish
|
||||
handle1.join().unwrap();
|
||||
handle2.join().unwrap();
|
||||
|
||||
// 5. Print the final result
|
||||
println!("Final value: {}", *counter.lock().unwrap());
|
||||
}
|
||||
Loading…
Reference in New Issue