@@ -526,125 +526,6 @@ public void LockGuard_LockRead_WhenWriteAlreadyHeld_Throws()
526526 }
527527
528528 #endregion LockGuard – single-threaded
529-
530- #region LockGuard – concurrent exclusion via Dispose / Unlock
531-
532- [ Test ]
533- public void LockGuard_ReadLock_BlocksWriter_ReleasedOnDispose ( )
534- {
535- var locks = MakeLock ( ) ;
536- var writerStarted = new ManualResetEventSlim ( false ) ;
537- var writerEntered = new ManualResetEventSlim ( false ) ;
538- Task writer ;
539-
540- {
541- using var guard = locks [ 0 ] . AcquireReadLock ( ) ;
542-
543- writer = Task . Run ( ( ) =>
544- {
545- writerStarted . Set ( ) ;
546- locks [ 0 ] . EnterWrite ( ) ;
547- writerEntered . Set ( ) ;
548- locks [ 0 ] . ExitWrite ( ) ;
549- } ) ;
550-
551- writerStarted . Wait ( ) ;
552- Thread . Sleep ( 30 ) ;
553- Assert . That ( writerEntered . IsSet , Is . False ,
554- "Writer should be blocked while read guard is held" ) ;
555- }
556-
557- Assert . That ( writerEntered . Wait ( TimeSpan . FromSeconds ( 5 ) ) , Is . True ,
558- "Writer should enter after read guard is disposed" ) ;
559- writer . Wait ( ) ;
560- }
561-
562- [ Test ]
563- public void LockGuard_WriteLock_BlocksReader_ReleasedOnDispose ( )
564- {
565- var locks = MakeLock ( ) ;
566- var readerStarted = new ManualResetEventSlim ( false ) ;
567- var readerEntered = new ManualResetEventSlim ( false ) ;
568- Task reader ;
569-
570- {
571- using var guard = locks [ 0 ] . AcquireWriteLock ( ) ;
572-
573- reader = Task . Run ( ( ) =>
574- {
575- readerStarted . Set ( ) ;
576- locks [ 0 ] . EnterRead ( ) ;
577- readerEntered . Set ( ) ;
578- locks [ 0 ] . ExitRead ( ) ;
579- } ) ;
580-
581- readerStarted . Wait ( ) ;
582- Thread . Sleep ( 30 ) ;
583- Assert . That ( readerEntered . IsSet , Is . False ,
584- "Reader should be blocked while write guard is held" ) ;
585- }
586-
587- Assert . That ( readerEntered . Wait ( TimeSpan . FromSeconds ( 5 ) ) , Is . True ,
588- "Reader should enter after write guard is disposed" ) ;
589- reader . Wait ( ) ;
590- }
591-
592- [ Test ]
593- public void LockGuard_WriteLock_BlocksOtherWriters_ReleasedOnDispose ( )
594- {
595- var locks = MakeLock ( ) ;
596- var writer2Started = new ManualResetEventSlim ( false ) ;
597- var writer2Entered = new ManualResetEventSlim ( false ) ;
598- Task writer2 ;
599-
600- {
601- using var guard = locks [ 0 ] . AcquireWriteLock ( ) ;
602-
603- writer2 = Task . Run ( ( ) =>
604- {
605- writer2Started . Set ( ) ;
606- locks [ 0 ] . EnterWrite ( ) ;
607- writer2Entered . Set ( ) ;
608- locks [ 0 ] . ExitWrite ( ) ;
609- } ) ;
610-
611- writer2Started . Wait ( ) ;
612- Thread . Sleep ( 30 ) ;
613- Assert . That ( writer2Entered . IsSet , Is . False ,
614- "Second writer should be blocked while write guard is held" ) ;
615- }
616-
617- Assert . That ( writer2Entered . Wait ( TimeSpan . FromSeconds ( 5 ) ) , Is . True ,
618- "Second writer should enter after write guard is disposed" ) ;
619- writer2 . Wait ( ) ;
620- }
621-
622- [ Test ]
623- public void LockGuard_Unlock_ReleasesWriteLock_AllowsConcurrentWriter ( )
624- {
625- var locks = MakeLock ( ) ;
626- var guard = locks [ 0 ] . AcquireWriteLock ( ) ;
627- bool writer2Entered = false ;
628-
629- var writer2 = Task . Run ( ( ) =>
630- {
631- locks [ 0 ] . EnterWrite ( ) ;
632- Volatile . Write ( ref writer2Entered , true ) ;
633- locks [ 0 ] . ExitWrite ( ) ;
634- } ) ;
635-
636- Thread . Sleep ( 30 ) ;
637- Assert . That ( Volatile . Read ( ref writer2Entered ) , Is . False ,
638- "Writer2 should be blocked before Unlock" ) ;
639-
640- guard . Unlock ( ) ;
641-
642- Assert . That ( Task . WaitAll ( new [ ] { writer2 } , TimeSpan . FromSeconds ( 5 ) ) , Is . True ) ;
643- Assert . That ( writer2Entered , Is . True ,
644- "Writer2 should have entered after Unlock" ) ;
645- }
646-
647- #endregion LockGuard – concurrent exclusion via Dispose / Unlock
648529 }
649530}
650531
0 commit comments