Exemple #1
0
        public void StartTestSPSCQueue()
        {
            SpinWait spinner = new SpinWait();

            _consumerThread = new Thread(() =>
            {
                Console.WriteLine("SPSCQueue consumer started");
                Stopwatch sw = Stopwatch.StartNew();
                for (ulong i = 0; i < Count;)
                {
                    ulong val;
                    while (!_spscQueue.TryDequeue(out val))
                    {
                        spinner.SpinOnce();
                    }

                    if (val != i)
                    {
                        Console.WriteLine("wrong value " + val + " ,correct: " + i);
                    }
                    i++;
                }
                Console.WriteLine("SPSCQueue consumer done {0}", sw.Elapsed);
            });

            _producerThread = new Thread(() =>
            {
                Console.WriteLine("SPSCQueue producer started");
                Stopwatch sw = Stopwatch.StartNew();
                for (ulong i = 0; i < Count;)
                {
                    while (!_spscQueue.TryEnqueue(i))
                    {
                        spinner.SpinOnce();
                    }

                    i++;
                }
                Console.WriteLine("SPSCQueue producer done {0}", sw.Elapsed);
            });

            _consumerThread.Start();
            _producerThread.Start();

#if !UNITY_EDITOR && !UNITY_STANDALONE
            _consumerThread.Join();
            _producerThread.Join();
#endif
        }
        // Demonstration that this queue is SPSC
        public void ConcurrencyTest()
        {
            var q     = new SPSCQueue <int>(16);
            int count = 10000;

            Thread reader = new Thread(() =>
            {
                for (int i = 0; i < count; i++)
                {
                    int item;
                    while (!q.TryDequeue(out item))
                    {
                    }

                    Assert.AreEqual(i, item);
                }
            });

            reader.Start();

            for (int i = 0; i < count; i++)
            {
                while (!q.TryEnqueue(i))
                {
                }
            }

            reader.Join();
        }