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 } ;
56use 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