@@ -53,25 +53,32 @@ fn check_conditional_variables_notify_one() {
53
53
}
54
54
}
55
55
56
- /// The test taken from the Rust documentation.
57
56
fn check_conditional_variables_notify_all ( ) {
58
- let pair = Arc :: new ( ( Mutex :: new ( false ) , Condvar :: new ( ) ) ) ;
59
- let pair2 = pair. clone ( ) ;
57
+ let pair = Arc :: new ( ( ( Mutex :: new ( ( ) ) ) , Condvar :: new ( ) ) ) ;
60
58
61
- thread:: spawn ( move || {
62
- let ( lock, cvar) = & * pair2;
63
- let mut started = lock. lock ( ) . unwrap ( ) ;
64
- * started = true ;
65
- // We notify the condvar that the value has changed.
66
- cvar. notify_all ( ) ;
67
- } ) ;
59
+ // Spawn threads and block them on the conditional variable.
60
+ let handles: Vec < _ > = ( 0 ..5 )
61
+ . map ( |_| {
62
+ let pair2 = pair. clone ( ) ;
63
+ thread:: spawn ( move || {
64
+ let ( lock, cvar) = & * pair2;
65
+ let guard = lock. lock ( ) . unwrap ( ) ;
66
+ // Block waiting on the conditional variable.
67
+ let _ = cvar. wait ( guard) . unwrap ( ) ;
68
+ } )
69
+ } )
70
+ . inspect ( |_| {
71
+ thread:: yield_now ( ) ;
72
+ thread:: yield_now ( ) ;
73
+ } )
74
+ . collect ( ) ;
68
75
69
- // Wait for the thread to start up.
70
- let ( lock , cvar ) = & * pair ;
71
- let mut started = lock . lock ( ) . unwrap ( ) ;
72
- // As long as the value inside the `Mutex<bool>` is `false`, we wait.
73
- while ! * started {
74
- started = cvar . wait ( started ) . unwrap ( ) ;
76
+ let ( _ , cvar ) = & * pair ;
77
+ // Unblock all threads.
78
+ cvar . notify_all ( ) ;
79
+
80
+ for handle in handles {
81
+ handle . join ( ) . unwrap ( ) ;
75
82
}
76
83
}
77
84
0 commit comments