public async Task EnterAsyncTest()
        {
            int i = 0, k = 0;
            var locker = new OmniLocker();

            async Task action()
            {
                foreach (var _ in Enumerable.Range(0, 10))
                {
                    using (var ctx = await locker.EnterAsync())
                    {
                        var j = i;
                        output.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: read {j}.");
                        Thread.Sleep(100);
                        i = j + 1;
                        output.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: write {j + 1}.");
                        Interlocked.Increment(ref k);
                    }
                }
            }

            var t1 = action();
            var t2 = action();
            var t3 = action();

            await Task.WhenAll(t1, t2, t3);

            Assert.Equal(k, i);
        }
        public void EnterTest()
        {
            int i = 0, k = 0;
            var locker = new OmniLocker();

            void action()
            {
                foreach (var _ in Enumerable.Range(0, 10))
                {
                    using (var ctx = locker.Enter())
                    {
                        var j = i;
                        output.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: read {j}.");
                        Thread.Sleep(100);
                        i = j + 1;
                        output.WriteLine($"{Thread.CurrentThread.ManagedThreadId}: write {j + 1}.");
                        Interlocked.Increment(ref k);
                    }
                }
            }

            var t1 = Task.Run(action);
            var t2 = Task.Run(action);
            var t3 = Task.Run(action);

            t1.Wait();
            t2.Wait();
            t3.Wait();

            Assert.Equal(k, i);
        }
        public void EnterBenchmark()
        {
            var duration = TimeSpan.FromSeconds(5);
            var locker   = new OmniLocker();

            int count = 0;

            void increment(ref int i)
            {
                var sw = Stopwatch.StartNew();

                while (sw.Elapsed < duration)
                {
                    using (var locked = locker.Enter())
                        i++;
                }
            }

            var list = new List <Thread>();

            for (int i = 0; i < 4; i++)
            {
                list.Add(new Thread(new ThreadStart(() => increment(ref count))));
            }

            foreach (var t in list)
            {
                t.Start();
            }

            foreach (var t in list)
            {
                t.Join();
            }

            output.WriteLine($"{count} iteration in {duration}.");

            Assert.True(true);
        }