public void Lock() { if (!locked.CompareExchange(true, false)) { SpinLock(); } }
public void CompareExchange_Twice_SecondFalse() { var subject = new AtomicBool(); Assert.True(subject.CompareExchange(true, false)); Assert.False(subject.CompareExchange(true, false)); }
public void CompareExchange_Concurrent() { int accessedTimes = 0; var gate = new object(); var evt = new ManualResetEvent(false); AtomicBool subject = false; Task[] tasks = Enumerable.Repeat( Task.Run( () => { lock (gate) { evt.WaitOne(); } if (subject.CompareExchange(true, false)) { Interlocked.Increment(ref accessedTimes); } }), 10) .ToArray(); evt.Set(); Assert.True(Task.WaitAll(tasks, TimeSpan.FromSeconds(10))); Assert.Equal(1, accessedTimes); }
public void AtomicBoolTests_CompareExchangeTest() { var atomicBool = new AtomicBool(); var counter = 0; var iterations = 100; Parallel.For(0, iterations, (i) => { while (!atomicBool.CompareExchange(false, true)) ; ++counter; atomicBool.Value = false; }); Assert.AreEqual(iterations, counter); }