Exemple #1
0
        public static void TestLocks(Action <TimeSpan, bool, string> logEntry)
        {
            ILocker[] lockStyles =
            {
                new NoLock(),
                new InterlockedSpinLock(),
                new MonitorLock(),
                new MutexLock(),
                new SemaphoreSlimLock(),
                new SemaphoreLock(),
                new ReaderWriterLockSlimLock()
            };

            const int count = 1000000;

            foreach (var ls in lockStyles)
            {
                using (ILocker theLock = ls)
                {
                    for (int mode = 0; mode < 2; mode++)
                    {
                        bool exclusive = (mode == 0);
                        var  sw        = Stopwatch.StartNew();

                        CountdownEvent startGate = new CountdownEvent(2);
                        Action         work      = () => {
                            startGate.Signal();
                            for (int n = 0; n < count; n++)
                            {
                                theLock.EnterLock(exclusive);
                                counter++; // "the work"
                                theLock.ExitLock();
                            }
                        };

                        // Block this thread on the results.
                        Task.WaitAll(
                            Task.Run(work),
                            Task.Run(work));

                        sw.Stop();

                        logEntry?.Invoke(sw.Elapsed, exclusive, theLock.GetType().Name);
                    }
                }
            }
        }