@@ -201,41 +201,37 @@ fn condition_variable_trigger_all_signals_all_waiters() {
201
201
202
202
#[ test]
203
203
fn condition_variable_trigger_one_signals_one_waiter ( ) {
204
+ const NUMBER_OF_THREADS : usize = 2 ;
205
+
204
206
let handle = MutexHandle :: < ConditionVariableData < i32 > > :: new ( ) ;
205
- thread:: scope ( |s| {
206
- let counter = Arc :: new ( AtomicI32 :: new ( 0 ) ) ;
207
- let sut = Arc :: new (
208
- ConditionVariableBuilder :: new ( )
209
- . create_condition_variable ( 500 , |v| * v > 1000 , & handle)
210
- . unwrap ( ) ,
211
- ) ;
207
+ let counter = AtomicI32 :: new ( 0 ) ;
208
+ let sut = ConditionVariableBuilder :: new ( )
209
+ . create_condition_variable ( 500 , |v| * v > 1000 , & handle)
210
+ . unwrap ( ) ;
211
+ let barrier = Barrier :: new ( 3 ) ;
212
212
213
- let sut_thread1 = Arc :: clone ( & sut) ;
214
- let counter_thread1 = Arc :: clone ( & counter) ;
215
- let t1 = s. spawn ( move || {
216
- sut_thread1. wait ( ) . unwrap ( ) ;
217
- counter_thread1. fetch_add ( 1 , Ordering :: Relaxed ) ;
218
- } ) ;
213
+ thread:: scope ( |s| {
214
+ let mut threads = vec ! [ ] ;
215
+ for _ in 0 ..NUMBER_OF_THREADS {
216
+ threads. push ( s. spawn ( || {
217
+ barrier. wait ( ) ;
219
218
220
- let sut_thread2 = Arc :: clone ( & sut) ;
221
- let counter_thread2 = Arc :: clone ( & counter) ;
222
- let t2 = s. spawn ( move || {
223
- sut_thread2. wait ( ) . unwrap ( ) ;
224
- counter_thread2. fetch_add ( 1 , Ordering :: Relaxed ) ;
225
- } ) ;
219
+ sut. wait ( ) . unwrap ( ) ;
220
+ counter. fetch_add ( 1 , Ordering :: Relaxed ) ;
221
+ } ) ) ;
222
+ }
226
223
224
+ barrier. wait ( ) ;
227
225
thread:: sleep ( TIMEOUT ) ;
228
- let counter_old_1 = counter. load ( Ordering :: Relaxed ) ;
226
+ assert_that ! ( counter. load( Ordering :: Relaxed ) , eq 0 ) ;
229
227
sut. trigger_one ( ) ;
230
- thread:: sleep ( TIMEOUT ) ;
231
- let counter_old_2 = counter. load ( Ordering :: Relaxed ) ;
228
+ assert_that ! ( || counter. load( Ordering :: Relaxed ) , block_until 1 ) ;
232
229
sut. trigger_one ( ) ;
233
230
234
- t1. join ( ) . unwrap ( ) ;
235
- t2. join ( ) . unwrap ( ) ;
231
+ for t in threads {
232
+ t. join ( ) . unwrap ( ) ;
233
+ }
236
234
237
- assert_that ! ( counter_old_1, eq 0 ) ;
238
- assert_that ! ( counter_old_2, eq 1 ) ;
239
235
assert_that ! ( counter. load( Ordering :: Relaxed ) , eq 2 ) ;
240
236
} ) ;
241
237
}
0 commit comments