Skip to content

Commit 68f76ec

Browse files
Jade WibbelsJade Wibbels
authored andcommitted
clean up and formatting
1 parent 0833783 commit 68f76ec

File tree

1 file changed

+73
-6
lines changed

1 file changed

+73
-6
lines changed

module2/data_race/src/main.rs

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
// Mutex that protects the data vector, and then we spawn three threads
22
//that each acquire a lock on the mutex and modify an element of the vector.
3+
// https://doc.rust-lang.org/std/sync/struct.Mutex.html
34

4-
use std::sync::Mutex;
5+
use std::sync::{Arc, Condvar, Mutex, RwLock};
56
use std::thread;
67

7-
fn main() {
8-
let data = Mutex::new(vec![1, 2, 3]);
8+
fn using_mutex() {
9+
println!("Mutex Example");
10+
let data = Arc::new(Mutex::new(vec![1, 2, 3]));
911

1012
let handles: Vec<_> = (0..3)
1113
.map(|i| {
12-
let data = data.lock().unwrap().clone();
14+
let data = Arc::clone(&data);
1315
thread::spawn(move || {
14-
let mut data = data;
16+
let mut data = data.lock().unwrap();
1517
data[i] += 1;
1618
println!("{:?}", data);
1719
})
@@ -22,7 +24,72 @@ fn main() {
2224
handle.join().unwrap();
2325
}
2426

25-
println!("{:?}", data);
27+
let data = data.lock().unwrap();
28+
println!("Final data: {:?}", *data);
29+
}
30+
31+
fn using_rwlock() {
32+
println!("RwLock Example");
33+
// Create an RwLock protecting a vector
34+
let data = Arc::new(RwLock::new(vec![1, 2, 3]));
35+
36+
// Spawn three threads that each acquire a write lock on the RwLock and modify an element of the vector
37+
let handles: Vec<_> = (0..3)
38+
.map(|i| {
39+
let data = Arc::clone(&data);
40+
thread::spawn(move || {
41+
let mut data = data.write().unwrap();
42+
data[i] += 1;
43+
println!("Thread {}: {:?}", i, *data);
44+
})
45+
})
46+
.collect();
47+
48+
// Wait for all threads to finish
49+
for handle in handles {
50+
handle.join().unwrap();
51+
}
52+
53+
// Acquire a read lock to print the final state of the vector
54+
let data = data.read().unwrap();
55+
56+
println!("Final data: {:?}", *data);
57+
}
58+
59+
fn using_condvar() {
60+
println!("Condvar Example");
61+
let data = Arc::new((Mutex::new(vec![1, 2, 3]), Condvar::new()));
62+
let mut handles = vec![];
63+
64+
for i in 0..3 {
65+
let data = Arc::clone(&data);
66+
let handle = thread::spawn(move || {
67+
let (lock, cvar) = &*data;
68+
let mut data = lock.lock().unwrap();
69+
data[i] += 1;
70+
println!("Thread {}: {:?}", i, *data);
71+
cvar.notify_one();
72+
});
73+
handles.push(handle);
74+
}
75+
76+
for handle in handles {
77+
handle.join().unwrap();
78+
}
79+
80+
let (lock, cvar) = &*data;
81+
let mut data = lock.lock().unwrap();
82+
while data.iter().any(|&x| x == 1) {
83+
data = cvar.wait(data).unwrap();
84+
}
85+
86+
println!("Final data: {:?}", *data);
87+
}
88+
89+
fn main() {
90+
using_mutex();
91+
using_rwlock();
92+
using_condvar();
2693
}
2794

2895
/*

0 commit comments

Comments
 (0)