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(); }