public void Lock()
 {
     if (!locked.CompareExchange(true, false))
     {
         SpinLock();
     }
 }
Пример #2
0
        public void CompareExchange_Twice_SecondFalse()
        {
            var subject = new AtomicBool();

            Assert.True(subject.CompareExchange(true, false));
            Assert.False(subject.CompareExchange(true, false));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }