public void ShouldEnterAndWaitAndAcqLockInSeparateThread() { var @ref = new LockRef(); using (var @event = new Barrier(2)) { var firstSuccess = false; var secondSuccess = false; @ref.slimLock.Enter(); ThreadPool.QueueUserWorkItem(x => { firstSuccess = [email protected](); @event.SignalAndWait(); @event.SignalAndWait(); secondSuccess = @ref.slimLock.TryEnter(); }); @event.SignalAndWait(); @ref.slimLock.Leave(); @event.SignalAndWait(); Assert.IsTrue(firstSuccess, "First thread blocked by first"); Assert.IsTrue(secondSuccess, "Second thread blocked by first"); } }
public void ShouldFailToFreeInSeparateThread() { var @ref = new LockRef(); var manualEvent = new ManualResetEvent(false); var success = false; @ref.slimLock.Enter(); ThreadPool.QueueUserWorkItem(x => { try { @ref.slimLock.Leave(); } catch { success = true; } manualEvent.Set(); }); manualEvent.WaitOne(); @ref.slimLock.Leave(); Assert.IsTrue(success, "Should throw for locked in another thread"); }
public void ShouldEnterAndWaitInSeparateThread() { var @ref = new LockRef(); var manualEvent = new ManualResetEvent(false); var success = false; @ref.slimLock.Enter(); ThreadPool.QueueUserWorkItem(x => { success = [email protected](); manualEvent.Set(); }); manualEvent.WaitOne(); @ref.slimLock.Leave(); Assert.IsTrue(success, "Shouldn't enter in separate thread"); }